Anonymní profil TomyB – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil TomyB – Programujte.comAnonymní profil TomyB – Programujte.com

 

Příspěvky odeslané z IP adresy 94.113.172.–

TomyB
C / C++ › CFont - vyhlazení písma, WinCE
23. 4. 2018   #220505

#7 TomyB
Tak jsem si udělal replace fci, a čeština jak víno :-)

LPTSTR unicodefixCZ(LPTSTR str)
{
	while(*str!='\0')
	{
		if(*str==236)
			*str=0x0115; //ě
		if(*str==353)
			*str=0x0161; //š
		if(*str==232)
			*str=0x010d; //č
		if(*str==248)
			*str=0x0159; //ř
		if(*str==382)
			*str=0x017e; //ž
		if(*str==253)
			*str=0x00fd; //ý
		if(*str==225)
			*str=0x00e1; //á
		if(*str==237)
			*str=0x00ed; //í
		if(*str==233)
			*str=0x00e9; //é
		if(*str==242)
			*str=0x0148; //ň
		if(*str==157)
			*str=0x0165; //ť
		if(*str==250)
			*str=0x00fa; //ú
		if(*str==249)
			*str=0x016f; //ů
		if(*str==239)
			*str=0x010f; //ď

		if(*str==204)
			*str=0x011a; //Ě
		if(*str==352)
			*str=0x0160; //Š
		if(*str==200)
			*str=0x010c; //Č
		if(*str==216)
			*str=0x0158; //Ř
		if(*str==381)
			*str=0x017d; //Ž
		if(*str==221)
			*str=0x00dd; //Ý
		if(*str==193)
			*str=0x00c1; //Á
		if(*str==205)
			*str=0x00cd; //Í
		if(*str==201)
			*str=0x00c9; //É
		if(*str==210)
			*str=0x0147; //Ň
		if(*str==141)
			*str=0x0164; //Ť
		if(*str==218)
			*str=0x00da; //Ú
		if(*str==217)
			*str=0x016e; //Ů
		if(*str==207)
			*str=0x010e; //Ď
		str++;
	}
	return str;
}

Připojen obrázek.

TomyB
C / C++ › CFont - vyhlazení písma, WinCE
22. 4. 2018   #220493

#6 Radek Chalupa
Kompiluji to pro Unicode.

Když to předělám na DrawTextA, tak mám error unresolved external symbol. A navíc nemůžu použít CFONT, pod HFONT nefunguje načtení vlastního fontu. Je tam výchozí Arial. :-(

Jde zkonvertovat český text z char* do w_char* bez ztráty diakritiky?

TomyB
C / C++ › CFont - vyhlazení písma, WinCE
22. 4. 2018   #220489

Se v tom nějak motám, přes toto jsem si načtený text převedl, v const char* vidím správný český text, ale jak s tím do DrawTextu, který chce LPCTSTR?

char *UnicodeToCodePage(int codePage, const wchar_t *src)
    {
    if (!src) return 0;
    int srcLen = wcslen(src);
    if (!srcLen)
	{
	char *x = new char[1];
	x[0] = '\0';
	return x;
	}
	
    int requiredSize = WideCharToMultiByte(codePage,
        0,
        src,srcLen,0,0,0,0);
	
    if (!requiredSize)
        {
        return 0;
        }
	
    char *x = new char[requiredSize+1];
    x[requiredSize] = 0;
	
    int retval = WideCharToMultiByte(codePage,
        0,
        src,srcLen,x,requiredSize,0,0);
    if (!retval)
        {
        delete [] x;
        return 0;
        }
	
    return x;
    }
TomyB
C / C++ › CFont - vyhlazení písma, WinCE
22. 4. 2018   #220484

#3 Radek Chalupa
Tak text natvrdo vložený funguje jak s EASTEUROPE_CHARSET tak ANSI_CHARSET, čeština se zobrazí, problém bude asi s tím jak otevírám ten soubor

...
FILE * f = _tfopen(path, _T("rt"));
	if(f)
	{
		TCHAR line[1024] = {0};
		LPTSTR key;
		LPTSTR value;
		LPTSTR it;

		while(_fgetts(line, 1024, f))
		{
...


zkoušel jsem přidat "rt, ccs=UTF-8", ANSI, UNICODE, a dle toho mít uložený TXT, ale výsledek je stejný nebo nelze soubor otevřít.

TomyB
C / C++ › CFont - vyhlazení písma, WinCE
21. 4. 2018   #220477

Takže vyhlazeno, a teď ještě bojuji s češtinou, načítám texty z txt souboru

CDC*	pDC = CDC::FromHandle(hdcMem);
CFont font;
VERIFY(font.CreateFont(
   36,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   400,                       // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   4,                         // nQuality
   VARIABLE_PITCH | FF_ROMAN, // nPitchAndFamily
   TEXT("NewDR")));           // lpszFacename

CFont *pFont = pDC->SelectObject(&font);
pDC->SetTextColor(g_TextColor);
pDC->DrawText(g_Caption,-1,&crect,DT_WORDBREAK);
pDC->SelectObject(pFont);
font.DeleteObject();

a nezobrazují se mi korektně některé znaky

txt file je uložen jako ANSI, takto se zobrazí některé české znaky, pod UTF-8 se zobrazi úplné nesmysly

CharSet jsem zkousel měnit, nic z hodnot nepomohlo. Věděl by někdo jak pomoci češtině?

ěščřžýáíé zobrazí takto

Připojen obrázek.

Dík

TomyB
C / C++ › CFont - vyhlazení písma, WinCE
8. 4. 2018   #220286

Ahoj, načítám vlastní TTF font přes AddResource();

a vytvářím přes

CFont font;
VERIFY(font.CreateFont(
   36,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   FW_NORMAL,                 // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   DEFAULT_QUALITY,           // nQuality
   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
   TEXT("NewDR")));           // lpszFacename

Ale při zobrazení je text kostičkovaný, nepodařilo se mi ho vyhladit. Viz výše nelze použít ani PROOF_QUALITY, on to nezná, zkoušel jsem rovnou číslo, ale to nepomáhá.

Jak by to šlo doladit?

Ukázka jak to vypadá (nahoře) a jak by to mělo vypadat (dole).

Připojen obrázek.

Připojen obrázek.

Díky

TomyB
C / C++ › ImagingFactory WinCE
4. 4. 2018   #220224

#4 BDS
Chci zobrazit PNG soubor s průhledným pozadím, teď jsem zkusil dát za BitBlt toto

TransparentBlt(g_hdcMem, 0,0,bitmap.bmWidth,bitmap.bmHeight, hdcMem, 0,0,bitmap.bmWidth,bitmap.bmHeight, RGB(0,0,0));

A zkouším právě nahrávat různé PNG obrázky zatím všechny se zobrazují korektně. :-)

TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220143

#21 TomyB
BINGOO

jsem zapoměl deletovat jeste HBRUSH

Takže teď to funguje perfektně :-)

Moc díky za trpělivost a za hlavně pomoc

TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220142

#22 Radek Chalupa
Tak blikání vyřešeno, ale neuvolňuje se mi paměť, když kliknu asi 10x na button, ta app spadne z důvodu nedostatku paměti.

 Tohle mam ve WM_DRAWITEM

	RECT Rec;
	GetClientRect(lpDIS->hwndItem, &Rec);

	g_hdcMem = CreateCompatibleDC(lpDIS->hDC);
	HBITMAP g_hBitmapMem = CreateCompatibleBitmap(lpDIS->hDC, Rec.right, Rec.bottom);

	HGDIOBJ hOld = SelectObject(g_hdcMem, g_hBitmapMem);
	
	FillRect(g_hdcMem, &Rec, hbPozadi);
	SetBkMode(g_hdcMem, TRANSPARENT);
	SetTextColor(g_hdcMem, 0x00AFFFFF);
	DrawText(g_hdcMem, TEXT("TEST BUTTON"), -1, &Rec, DT_CENTER);

	BitBlt(lpDIS->hDC, 0, 0, Rec.right, Rec.bottom, g_hdcMem, 0, 0, SRCCOPY);

	SelectObject(g_hdcMem, hOld);
	DeleteObject(g_hBitmapMem);
	DeleteDC(g_hdcMem);
	ReleaseDC(lpDIS->hwndItem, lpDIS->hDC);
TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220140

#19 Radek Chalupa
Tohle mi ve W10 běží hezky, žádný problém.

TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220139

#18 Radek Chalupa
Tak jsem to předělal podle to tvého kódu a výsledek je stále stejný, asi to bude tím, že je to WinCE a možná se to chová trošku jinak.

Napadlo mě. Ono to bliknutí způsobí ten moment mezi vykreslením pozadi buttonu a vykreslením textu.

Nelze tyto dve věci nějak spojit dohromady tedy vrazit text na bitmapu a tu pak zobrazit, nebo nejdriv načíst do paměti bitmapu pozadi a pak vepsat text a pak to zobrazit na tlacitko?

TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220136

#16 Radek Chalupa

V původním kódu v obsluze WM_CREATE volám WM_TIMER a to tolikrát kolikrát najde v konfiguračním souboru udaje s hodnotami buttonu (soubor podobný INI, [button] x=1, y=1 [button] x=1, y=100 atd), které se mají vykreslit. Možná bych to mohl předělat na cykl a nemusel ten WM_TIMER volat několikrat po sobě.

No nicméně v tom novém očištěném kódu ty buttony vytvářím ve WM_PAINT, zkoušel jsem i WM_CREATE, v obou případech se to chová stejně.

Dělám něco špatně, kde to tedy má být?

TomyB
C / C++ › Bitmap Button s vlastním tex…
27. 3. 2018   #220134

Problikne to při přesunu okna, při překrytí okna jiným a odsunutí, při kliknutí na button.

Udělal jsem úplně čístý app, jen s pozadim a dvema buttony, a i v tomto čístém příkladu to bliká.

#include "stdafx.h"
#include "Buttons.h"

#define MAX_LOADSTRING 100

HINSTANCE			hInst;
HWND				hwndCB;

ATOM				MyRegisterClass	(HINSTANCE, LPTSTR);
BOOL				InitInstance	(HINSTANCE, int);
LRESULT CALLBACK	WndProc			(HWND, UINT, WPARAM, LPARAM);

HBITMAP				hBackground = NULL;

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	MSG msg;

	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
	WNDCLASS	wc;

    wc.style			= CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc		= (WNDPROC) WndProc;
    wc.cbClsExtra		= 0;
    wc.cbWndExtra		= 0;
    wc.hInstance		= hInstance;
    wc.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUTTONS));
    wc.hCursor			= 0;
    wc.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName		= 0;
    wc.lpszClassName	= szWindowClass;

	return RegisterClass(&wc);
}


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	HWND	hWnd;
	TCHAR	szTitle[MAX_LOADSTRING];
	TCHAR	szWindowClass[MAX_LOADSTRING];

	hInst = hInstance;

	LoadString(hInstance, IDC_BUTTONS, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance, szWindowClass);

	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU,
		CW_USEDEFAULT, CW_USEDEFAULT, 800, 480, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{	
		return FALSE;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	return TRUE;
}

void On_DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	HBRUSH hbPozadi = CreatePatternBrush(LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BUTTON)));
   
	InflateRect(&lpDIS->rcItem, 0,0);
	FillRect(lpDIS->hDC, &lpDIS->rcItem, hbPozadi);
	SetBkMode(lpDIS->hDC, TRANSPARENT);
	SetTextColor(lpDIS->hDC, 0x00A0FFFF);
	switch ( lpDIS->CtlID )
	{
    case 1:
		lpDIS->rcItem.top = lpDIS->rcItem.bottom - 50;
		DrawText(lpDIS->hDC, TEXT("BUTTON A"), -1, &lpDIS->rcItem,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		break;
	case 2:
		lpDIS->rcItem.top = lpDIS->rcItem.bottom - 50;
		DrawText(lpDIS->hDC, TEXT("BUTTON B"), -1, &lpDIS->rcItem,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		break;
	}
	DeleteObject(hbPozadi);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	TCHAR szHello[MAX_LOADSTRING];

	switch (message) 
	{
		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 
			switch (wmId)
			{
				case 1:

					break;
				case 2:

					break;
				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_ERASEBKGND:
			return 0;
			break;
		case WM_CREATE:
			hBackground = (HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_POZADI));
			break;
		case WM_PAINT:
			RECT rt;
			hdc = BeginPaint(hWnd, &ps);

			if (hBackground==NULL) {

				GetClientRect(hWnd, &rt);
			
				LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
				DrawText(hdc, szHello, _tcslen(szHello), &rt, 
				DT_SINGLELINE | DT_VCENTER | DT_CENTER);
			} else {

				HDC hdcMem = CreateCompatibleDC(hdc);
				HGDIOBJ oldBitmap = SelectObject(hdcMem, hBackground);
				BITMAP bitmap;
				GetObject(hBackground, sizeof(bitmap), &bitmap);
				BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
				SelectObject(hdcMem, oldBitmap);
				DeleteDC(hdcMem);
			}

			EndPaint(hWnd, &ps);

			CreateWindowEx(NULL, L"button", TEXT("Button 1"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON | BS_OWNERDRAW, 1, 50, 160, 120, hWnd, (HMENU)1, hInst, NULL);
			CreateWindowEx(NULL, L"button", TEXT("Button 2"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON | BS_OWNERDRAW, 1, 175, 160, 120, hWnd, (HMENU)2, hInst, NULL);

			break;
		case WM_DRAWITEM:
			On_DrawItem((LPDRAWITEMSTRUCT)lParam);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
TomyB
C / C++ › Bitmap Button s vlastním tex…
26. 3. 2018   #220125

#11 Radek Chalupa
Tak jsem tam vlozil toto

case WM_CTLCOLORBTN:
            HBRUSH hBrushBtn;
            hBrushBtn = (HBRUSH) GetStockObject(NULL_BRUSH);
            SetBkMode((HDC) wParam, TRANSPARENT);
    return ((LRESULT) hBrushBtn);

a hle, ono už to nebliká, pozadí sedí jak přišitý :-), co ale problikává ještě, je text na buttonu :-(

TomyB
C / C++ › Bitmap Button s vlastním tex…
26. 3. 2018   #220122

#11 Radek Chalupa
přidáním WM_ERASEBKGND žádná změna.

Timer je tam z toho důvodu, že prochází config a najde všechny buttony předem načtené z konfiguračního souboru, když nastevení odpovídá buttonu, tak jej založí, pak se ukončí.

Timer je nastaven na 0.

Např. založí 6 tlačítek s různou pozicí a ukončí se.

TomyB
C / C++ › Bitmap Button s vlastním tex…
26. 3. 2018   #220120

#9 Radek Chalupa
Okno
 

ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR g_WindowClass)
{
	WNDCLASS	wc;

    wc.style			= CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc		= (WNDPROC) WndProc;
    wc.cbClsExtra		= 0;
    wc.cbWndExtra		= 0;
    wc.hInstance		= hInstance;
    wc.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
    wc.hCursor			= 0;
    wc.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName		= 0;
    wc.lpszClassName	= g_WindowClass;

	return RegisterClass(&wc);
}


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	hInst = hInstance;
	LoadString(hInstance, IDS_APP_CLASS, g_WindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance, g_WindowClass);

	LoadString(hInstance, IDS_APP_TITLE, g_Title, MAX_LOADSTRING);

	hWnd = CreateWindow(g_WindowClass, g_Title, nCmdShow != SW_HIDE ? WS_VISIBLE : 0,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return FALSE;
	}

	return TRUE;
}


int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	MSG msg;

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}


WndProc

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	...
	switch (message)
	{
		....
		case WM_CREATE:
			if (config->settings().background != NULL)
			{
				hBackground = (HBITMAP)SHLoadDIBitmap(config->settings().background);
				if (hBackground == NULL)
				{
					....
				}
			}
			SetTimer(hWnd, TIMER_SECTION_START, 0, NULL);

			break;
                case WM_PAINT:
		{
			RECT rt1 = {0};
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hWnd, &ps);
                        HDC hdcMem = CreateCompatibleDC(hdc);
			HGDIOBJ oldBitmap = SelectObject(hdcMem, hBackground);
			BITMAP bitmap;
			GetObject(hBackground, sizeof(bitmap), &bitmap);
			BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
			SelectObject(hdcMem, oldBitmap);
			DeleteDC(hdcMem);

			EndPaint(hWnd, &ps);

			break;
		}

                case WM_TIMER:
		{
                	KillTimer(hWnd, wParam);

                 	if (wParam == TIMER_SECTION_START)
			{
				section = config->nextSection();
				if (section == NULL)
				{
					....
					break;
				}
				switch (section->type)
				{
					case Config::esec::button:
						unsigned short * g_ImageNormal;
						unsigned long g_X;
						unsigned long g_Y;
						unsigned short * g_Id;
						
						for (unsigned long i = 0; i < section->argc; ++i)
						{
							
							if (section->args[i].type == Config::earg::x)
							{
								g_X = section->args[i].ulValue;
							}
							else if (section->args[i].type == Config::earg::y)
							{
								g_Y = section->args[i].ulValue;
							}
							else if (section->args[i].type == Config::earg::id)
							{
								g_Id = section->args[i].szValue;
							}
						}
						HINSTANCE hInst = GetModuleHandle(NULL);
						hButton = CreateWindowEx(NULL, L"button", g_Id, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON | BS_OWNERDRAW, g_X, g_Y, 263, 182, hWnd, (HMENU)1, hInst, NULL);
						SetTimer(hWnd, TIMER_SECTION_START, 0, NULL);
						break;
				}
			}
			break;
		}
		case WM_DRAWITEM:
			On_DrawItem((LPDRAWITEMSTRUCT)lParam);
			break;
		....
	}
	return 0;
}

Kresba buttonu

void On_DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	HBRUSH hbPozadi = CreatePatternBrush(LoadBitmap(hInst, MAKEINTRESOURCE(IDB_POZADI)));

InflateRect(&lpDIS->rcItem, 0,0);
  FillRect(lpDIS->hDC, &lpDIS->rcItem, hbPozadi);
  SetBkMode(lpDIS->hDC, TRANSPARENT);
  SetTextColor(lpDIS->hDC, 0x00A0FFFF);
  switch ( lpDIS->CtlID )
  {
    case 1:
        lpDIS->rcItem.top = lpDIS->rcItem.bottom - 50;
      DrawText(lpDIS->hDC, TEXT("TEST BUTTON"), -1, &lpDIS->rcItem,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
      break;
  }
  DeleteObject(hbPozadi);
}
TomyB
C / C++ › Bitmap Button s vlastním tex…
26. 3. 2018   #220114

#5 Radek Chalupa
WS_CLIPCHILDREN nepomáhá. Zkusil jsem i vytvořit vlastní wndproc pro ten button, ale nelze v ní odchytit WM_ITEMDRAW.

Pod tím vloženým pozadím problikne ta původní šedá plocha buttonu, tak jak jej windows standardne zobrazi. Ať již pohybem okna, nebo kliknutím na tlačítka.

:-(

TomyB
C / C++ › Bitmap Button s vlastním tex…
25. 3. 2018   #220111

Tak jsem to prošel s vaším příkladem, mám to shodne, přec to stále problikává. Já to tlačítkou tedy nemám v resources ale dynamicky generuji přes

hButton = CreateWindowEx(NULL, L"button", g_Id, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON | BS_OWNERDRAW, g_X, g_Y, 263, 182, hWnd, (HMENU) 1, hInst, NULL);
TomyB
C / C++ › Bitmap Button s vlastním tex…
25. 3. 2018   #220110

Na OWNERDRAW už to předělávám, ve výsledku už to funguje jak bych potřeboval, jen to problikává, resp pozadí buttonu problikává.

Příklady si u vás ještě prostuduju.

Díky

TomyB
C / C++ › Bitmap Button s vlastním tex…
25. 3. 2018   #220106

Ahoj, vytvářím vlastní button s bitmapou a textem, žel text se mi tam nedaří dostat tak jak bych chtěl.

Bitmapa se mi vykreslí, když dále použiji DrawText, tak i text vidím, ale Bitmapa chybí, když okno překruju jiným, nebo ho minimalizuji, tak po obnoveni vidim bitmapu a text zmizne.

Jak tak prosím dostat text natrvalo?

Vykresluji to v WM_TIMER

HINSTANCE hInst = GetModuleHandle(NULL);

hButton = CreateWindow(L"STATIC", g_Id, WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_NOTIFY, g_X, g_Y, 263, 182, hWnd, (HMENU) 1, hInst, NULL);
										HBITMAP hBmp = (HBITMAP)SHLoadDIBitmap(g_ImageNormal);
							
SendMessage(hButton, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);
							
RECT rt1 = {0};
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hButton, &ps);

GetClientRect(hButton, &rt1);
RECT rt = {rt1.left + 1, rt1.top + 1, rt1.right - 1, rt1.bottom -1 };
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, 0x0000FF00);

static TCHAR title[] = _T("Button A");
							
DrawText(hdc, title, _tcslen(title), &rt, DT_LEFT | DT_TOP);
EndPaint(hButton, &ps);

Díky za radu

TomyB
C / C++ › Vytváření typu objektu, ARM/…
21. 3. 2018   #220070

Tak jsem ten projekt přepsal z VS do eVC++, a tam to šlape jak hodinky, jak ARM, tak MIPS. Tak změním prostředí. :-)

TomyB
C / C++ › Vytváření typu objektu, ARM/…
20. 3. 2018   #220069

A jinak díky za snahu pomoci.

TomyB
C / C++ › Vytváření typu objektu, ARM/…
20. 3. 2018   #220068

Udělal jsem to takto načisto, ARM funguje, MIPS nefunguje. Takže mě napadá, zda není potřeba něco poštelovat ve Visual Studiu.

TomyB
C / C++ › Vytváření typu objektu, ARM/…
20. 3. 2018   #220063

Rozumím, ale i takto je tam něco ještě chybně.

Error    1    error LNK2019: unresolved external symbol "public: static class Config * __cdecl Config::getInstance(void)" (?getInstance@Config@@SAPAV1@XZ) referenced in function WinMain

Error    2    fatal error LNK1120: 1 unresolved externals

TomyB
C / C++ › Vytváření typu objektu, ARM/…
20. 3. 2018   #220036

Tento způsob zabral, na MIPS se to rozběhne
 

static Config& getInstance()
{
	static Config* instance;
	instance = new (Config);
	instance->loadConfig();
	return *instance;
}

Ale nedari se mi to nadefinovat v globalu
Config    * config = NULL;

a v WinMain
config = Config::getInstance();

error C2440 '=' cannot convert 'Config' to 'Config *'

TomyB
C / C++ › Vytváření typu objektu, ARM/…
19. 3. 2018   #220034

Nene nemám to 2x. Nějak s tím nemůžu hnout. Jsem to vyzobal na úplný základ. Bez tohoto řádku

static Config instance_;
 

se aplikace rozjede, s ním už ne. Jde to nějak jinak napsat? Dík

.h

class Config
{
public:
	static Config * getInstance();

protected:
	Config();

};


.cpp

#include <windows.h>

#include "stdafx.h"
#include "common.h"
#include "config.h"

Config::Config()
{
}


Config * Config::getInstance()
{
	static Config instance_; // Jakmile je tady toto, tak v MIPS zařízení apk nenastartuje
	//instance_.loadConfig();
	return &instance_;
}
TomyB
C / C++ › Vytváření typu objektu, ARM/…
19. 3. 2018   #220019

:-(

static Config* instance()
{
	static Config instance_;
	instance_.loadConfig();
	return &instance_;
}

error LNK2019

Config * Config::instance()
{
	static Config instance_;
	instance_.loadConfig();
	return &instance_;
}


fukční, ale jen v ARM, v MIPS je aplikace mrtvá

jeste jsem to bral kousek po kousku, bez tohoto se aplikace v MIPS rozjede, nejak reaguje.

Config::Config():m_sections(NULL), m_count(0), m_allocated(0), m_current(-1),
	m_file(NULL), m_line(0), m_seek(FALSE), m_include(FALSE)
{
	m_settings.background = NULL;
        ...
}
TomyB
C / C++ › Vytváření typu objektu, ARM/…
18. 3. 2018   #220017

Tohle částečně zafungovalo, ale mám problém s třídou, doteď jsem měl

Config*	config = NULL;

int WINAPI WinMain(...)
{
...
config = Config::getInstance();
...
}

A teď s tím po úpravě nehnu, hlásí to C2440 '=': cannot convert 'Config' to 'Config *'
 

TomyB
C / C++ › Vytváření typu objektu, ARM/…
18. 3. 2018   #220012

Ahoj,

vytvářím apku pro WinCE, jak pro ARM tak MIPS. Mám jeden problém. Po kompilaci pro MIPS, aplikace nenaběhne, pokud je použit tento řádek pro vytváření typu objektu. Pod ARM je to v pořádku. Co je špatně, mám někdě něco v nastavení VS změnit?

Vytvářím pod VS2008 C++

cpp:

Config * Config::getInstance()
{
static Config * config = NULL;
config = new Config();

return config;

}

h:
class Config
{
public:
    enum earg
    {
        label,
        .....
    }

static Config * getInstance();

.....

};

Dík

Tomy

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý