nie rysuje tla w glownym oknie

0

Witam, chcialem sobie zrobic tlo w moim programie, wydaje mi sie ze wszystko zrobilem jak najbardziej ok, jednak nie chce sie wyswietlac tlo.
jednak gdy dodam zaraz po case WM_PAINT:{ messageboxa to tlo sie pojawia, chcialem po prostu zobaczyc czy wchodzi do tego case.

linie 37,73,205

 
#include <windows.h>
#include <Windowsx.h>
#include <commctrl.h>
#include <wchar.h>
#include <locale.h>
#include <time.h>
#include <c:\Program Files\MySQL\MySQL Connector C 6.0.2\include\mysql.h>

//STALE
#define ID_TAB_D 0
#define ID_TAB_M 1
#define ID_DODAJ_KANARA 503
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502
#define HRAMKA 504

//ZMIENNE POTRZEBNE DO POLACZENIA Z BAZA
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
int num_fields;
int mysql_set;
time_t ltime;//ZMIENNA W KTOREJ JEST AKTUALNY CZAS W SEKUNDACH,POTRZEBNE DO AKTUALIZACJI MYSQL

MSG msgs;//KOMUNIKATY ZAPISYWANE W ZMIENNEJ GLOBALNEJ
CHAR szClassName[]="AntyKanar";

//UCHWYTY
HWND MainWindow; //GLOWNE OKNO
HWND hTab; //ZAKLADKI
HWND hCombo; //LISTA COMBOBOX DO PRZYSTANKOW
HWND hRamka; //RAMKA DO COMBOBOXA I BUTTONA
HWND hDodajKanara; //BUTTON DO DODAWANIA KANARA

HINSTANCE *hInst; //wskaznik na numer instancji okna glownego

//BITMAPA
HBITMAP hbmTlo;
BITMAP  tlo_info;
HDC hdc,hdcBitmapy,hdcMapy;


LRESULT CALLBACK NewWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);//FUNCKJA OBSLUGUJACA ZDARZENIA Z RAMKI
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
WNDPROC g_OldWndProc;//WSKAZNIK NA FUNKCJE WNDPROC
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lStart,INT nShow)
{
	//ZAINICJOWANIE POLACZENIA Z BAZA
	mysql_init(&mysql);
	mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"UTF8");
	INT a;
	mysql_real_connect(&mysql,"localhost","root","","kanary",0,NULL,0);



	hInst = &hInstance;
	WNDCLASSEX wc;//KLASA OKNA
	wc.hInstance = *hInst;
	wc.lpszClassName = szClassName;
	wc.lpfnWndProc = WndProc;
	wc.style = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
	wc.hIconSm = LoadIcon( 0, IDI_APPLICATION );
	wc.hCursor = LoadCursor( 0, IDC_ARROW );
	wc.lpszMenuName = 0;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
	if(!RegisterClassEx(&wc)) return 0; //REJESTRACJA OKNA
	MainWindow = CreateWindowEx( 0, szClassName, "AntyKanar Lublin", WS_OVERLAPPEDWINDOW, 20, 20, 860, 510, 0, 0, *hInst, 0 ); //TWORZENIE OKNA GLOWNEGO

	hbmTlo =( HBITMAP ) LoadImage( NULL, "bitmapa.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
	GetObject( hbmTlo, sizeof( tlo_info ), &tlo_info );//j.w.

//TWORZENIE ZAKLADEK "DODAWANIE KANARA|MAPA"
typedef struct {
    UINT mask;
    #if (_WIN32_IE >= 0x0300)
    DWORD dwState;
    DWORD dwStateMask;
    #else
    UINT lpReserved1;
    UINT lpReserved2;
    #endif
    LPTSTR pszText;
    int cchTextMax;
    int iImage;
    LPARAM lParam;
} TCITEM, * LPTCITEM;

    hTab = CreateWindowEx( 0, WC_TABCONTROL, 0, WS_CHILD | WS_VISIBLE | TCS_FIXEDWIDTH, 0, 0, 860, 510, MainWindow,( HMENU ) 10, *hInst, NULL );
    TabCtrl_SetItemSize( hTab, 425, 20 );
    TCITEM tci1, tci2;
    tci1.mask = TCIF_TEXT;
    tci2.mask = TCIF_TEXT;
    tci1.pszText = "Dodawanie kanara";
    tci2.pszText = "Mapa";
    tci1.cchTextMax = sizeof( "Dodawanie kanara" );
    tci2.cchTextMax = sizeof( "Mapa" );
    TabCtrl_InsertItem( hTab, ID_TAB_D, & tci1 );
	TabCtrl_InsertItem( hTab, ID_TAB_M, & tci2 );
    //KONIEC TWORZENIA ZAKLADEK
	//DODAWANIE RAMKI NA COMBOBOX I BUTTON
	hRamka = CreateWindowEx( 0, "BUTTON", "Zauważyłeś kanara? Dodaj go!", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 70, 70, 600, 70, MainWindow, NULL, *hInst, NULL );
	//KONIEC DODAWANIA RAMKI
	
	//DODAWANIE COMBOBOX
	hCombo = CreateWindowEx(0,WC_COMBOBOX,0,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_VSCROLL,30,30,300,300,hRamka,0,*hInst,0);
    //dodawanie opcji wyboru
    mysql_query(&mysql,"SELECT `przystanek` FROM `baza_przystankow`");
	res = mysql_store_result(&mysql);
	num_fields = mysql_num_fields(res);
	while ((row = mysql_fetch_row(res)))
	{
		for(int i = 0; i < num_fields; i++)
    	{
			//KONWERTOWANIE CHAR TO WCHAR ABY WYSWIETLALO POLSKIE ZNAKI DLA UNICODE UTF8
        	const WCHAR *przystanek_wchar;
        	// required size
        	int nChars = MultiByteToWideChar(CP_UTF8, 0, row[i], -1, NULL, 0);
        	// allocate it
        	przystanek_wchar = new WCHAR[nChars];
        	MultiByteToWideChar(CP_UTF8, 0, row[i], -1, (LPWSTR)przystanek_wchar, nChars);
        	// use it....
        	SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)przystanek_wchar);
        	// delete it
        	delete [] przystanek_wchar;
    	}
	}
	//KONIEC DODAWANIA COMBOBOX'A
	
	//DODAWANIE BUTTONA DO DODAWANIA KANARA
	hDodajKanara = CreateWindowEx( 0, "BUTTON", "Dodaj Kanara!", WS_CHILD | WS_VISIBLE, 360, 25, 100, 30, hRamka, ( HMENU )ID_DODAJ_KANARA, *hInst, NULL );
	//PODMIENIAM PROCEDURE OBSLUGI OKNA DLA RAMKI
	g_OldWndProc = (WNDPROC) SetWindowLong (hRamka, GWL_WNDPROC, (LONG)NewWndProc);

   ShowWindow(MainWindow,nShow);
   while(GetMessage(&msgs, 0, 0, 0))
   {
     TranslateMessage(&msgs);
     DispatchMessage(&msgs);
   }
   return msgs.wParam;
}

//FUNKCJA OBSLUGUJACA ZDARZENIA W RAMCE
LRESULT CALLBACK NewWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
  case WM_COMMAND:
  {
    switch(wParam)
 {
 case ID_DODAJ_KANARA:
		{
				int numer = ComboBox_GetCurSel( hCombo );
				char* numer_char = new char;  
				itoa( numer+1, numer_char, 10 );
				if(numer == -1){
					MessageBox(hwnd, "Nie wybrałeś przystanku", "Błąd", MB_ICONINFORMATION);
				}else{
					time( &ltime );
					char* czas = new char;  
					itoa( ltime, czas, 10 );
					char zapytanie[100] = "UPDATE `baza_przystankow` SET `status` = '1',`godzina` = '";
					LPSTR zapytanie1 = "' WHERE id = '";
					LPSTR zapytanie2 = "'";
					lstrcat(zapytanie,czas); 
					lstrcat(zapytanie,zapytanie1); 
					lstrcat(zapytanie,numer_char); 
					lstrcat(zapytanie,zapytanie2); 
					MessageBox(hwnd, zapytanie, numer_char, MB_ICONINFORMATION);
					mysql_query(&mysql,zapytanie);
					delete czas;
					delete zapytanie;
					delete czas;
				}
				delete numer_char;
 		
	}
 break;
 case ID_PRZYCISK2:
 MessageBox(hwnd, "Wcisnąłeś przycisk 2", "Test", MB_ICONINFORMATION);
 break;
 default:
 return DefWindowProc(hwnd,msg,wParam,lParam);
 }
  }
  break;
 }
 
return CallWindowProc (g_OldWndProc, hwnd, msg, wParam, lParam);
}

//FUNKCJA OBSLUGUJACA ZDARZENIA W OKNIE GLOWNYM
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lPar)
{
	HDC hdc,hdcMapy; //zmienne na 2 konteksty
    PAINTSTRUCT ps;
    
	switch(msg)
	{
	case WM_PAINT:{
	hdc=BeginPaint(hwnd,&ps); //kontekst okna uzyskujemy w momencie odrysowywania
    hdcMapy=CreateCompatibleDC(hdc); //teraz musimy utworzyć kontekst pamięciowy dla bitmapy
    hbmTlo=(HBITMAP)SelectObject(hdcMapy,hbmTlo);
    BitBlt(hdc,0,0,tlo_info.bmWidth,tlo_info.bmHeight,hdcMapy,0,0,SRCCOPY);
    hbmTlo=(HBITMAP)SelectObject(hdcMapy,hbmTlo); //z powrotem zamieniamy bitmapy w kontekście
    ReleaseDC( hwnd, hdc );
    DeleteDC(hdcMapy); //usuwamy kontekst pamięciowy bitmapy
    EndPaint(hwnd,&ps);
      break;
	}  
		
		case WM_NOTIFY:
			LPNMHDR n;
			n =( LPNMHDR ) lPar;
			if( n->code == TCN_SELCHANGE && n->hwndFrom == hTab ) // Sprawdza, czy uchwyt pochodzi od hTab
			{
    			int index = TabCtrl_GetCurSel( hTab );
    			switch( index ) // indeks aktualnej kontrolki
    			{
    				case ID_TAB_D:
        				ShowWindow( hRamka, SW_SHOW );
        				//ShowWindow( hRadioButton, SW_HIDE );
        			break;
    				case ID_TAB_M:
        				ShowWindow( hRamka, SW_HIDE );
        				//ShowWindow( hRadioButton, SW_SHOW );
        			break;
    			}
			}
		break;
     	case WM_DESTROY:
       		DestroyWindow(hCombo);
       		PostQuitMessage(0);
       	break;
     	default:
       	return DefWindowProc(hwnd,msg,wParam,lPar);
   }
   return 0;
}
0

Kod jakością i porządkiem nie grzeszy :>

Przyczyna errora:
obrazek jest pod "ramką", więc go nie widać

Drobne uwagi:

  • nie wolno wołać Ci: "ReleaseDC( hwnd, hdc );" hdc tworzysz z BeginPaint i zwalniasz go EndPain, ReleaseDC wołasz tylko gdy zwalniasz coś HDC utworzone przez GetDC
  • upewnij się że obrazek faktycznie się ładuje if(jakiś_HANDLE == NULL) error??? nie jest nazbyt skomplikowane, czy może jest?
    -pewny jesteś że to tak ma być? :>
    char* czas = new char;
    itoa( ltime, czas, 10 );
    alokacja jednego chara jest imo bez sensu trochę, będzie crash :>
0

no dzieki za podpowiedz, wywalilem ReleaseDC( hwnd, hdc );
sprawdzilem tez ifem zaraz po
"hbmTlo =( HBITMAP ) LoadImage( NULL, "bitmapa.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );"
czy laduje sie, laduje.

ale przeciez ta ramka ma wymiary 600x70 wiec jak moze zakryc caly obraz, ktory ma gdzies 800x500. dodalem wm:paint do procedury obslugujacej ramke to tam wyswietla obrazek.

wstawiam screena jak to wyglada z messageboxem, wydaje mi sie ze ok obrazek laduje, tylko jak to zrobic bez messagebox
http://img854.imageshack.us/img854/4687/tlovm.jpg

a z tym char to nie wiem do konca jak to ma byc, dopiero sie ucze i ciezko mi to idzie

0

znaczy nie ramka tylko hTab
hTab = CreateWindowEx( 0, WC_TABCONTROL, 0, WS_CHILD | WS_VISIBLE | TCS_FIXEDWIDTH, 0, 0, 860, 510, MainWindow,( HMENU ) 10, *hInst, NULL );
więc 860x510

Ten Tab zakrywa całe okno główne, a to że widzisz obrazek jak masz MessageBoxa to efekt uboczny, tego, że wykonywanie zdarzeń twojego okna zostało "zatrzymane" na czas MessageBoxa i dlatego gdy "pchnie" program dalej powierzchnia Taba "zamalowuje" twój obrazek

Musisz zrobić ten obrazek jak zawartość kontrolki WM_STATIC (tak można w niej ustawić obrazek) i umieścić ją na odpowiednim poziomie, chyba na powierzchni Taba?

0

no tak, chyba na powierzchni taba jak mowisz, nie pomyslalem ze tab mi zakrywa tlo, tylko jak chcialbym zrobic oddzielne tla dla obu zakladek ( ID_TAB_D, ID_TAB_M ) to nie mam pojecia od czego zaczac

chyba chodzi Ci o WC_STATIC tak? mozesz jeszcze jakos podpowiedziec?

0

Tak, WM_STATIC, jeśli chcesz obrazek, zrezygnuj z rysowania ręcznego, STM_SETIMAGE ustawiasz mu bitmapę
http://msdn.microsoft.com/en-us/library/windows/desktop/bb760782(v=vs.85).aspx

Najprościej to chyba zrobisz tak:
Masz taba, z dwiema zakładkami, więc tworzysz 2x WM_STATIC na nim i w zależności od ustawionej zakładki chowasz jeden, a pokazujesz drugi WM_STATIC/obrazek
I teraz mając te 2 "statiki" resztę kontrolek tworzysz na nich, czyli twoja ramka niech będzie potomkiem tego STATICa, wtedy chowając STATICa automatycznie chowasz resztę "kontrolek dzieci", czyli traktujesz twoje 2 statiki jako powierzchnie dwóch zakładek taba....

1 użytkowników online, w tym zalogowanych: 0, gości: 1