Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Zdziwiony

[C++]Jak ustawić w WinAPI tło okna ?

Rekomendowane odpowiedzi

Witam. Mam pytanie, a mianowicie: W jaki sposób w WinAPI ustawić tło okna ??? Chodzi mi o wczytanie jakiegoś jpeg lub bmp... Bądź zmiana tła po prostu na jakiś kolor...

 

Bardzo proszę o pomoc i pozdrawiam ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli byś chciał mieć i tło i "przeźroczyste" kontrolki (static, editbox'y, itp) to polecam użyć WM_PAINT z ładowaniem bitmapy oraz WM_CTLCOLORSTATIC, czyli np. tak:

 

 

LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch (msg)
   {
	case WM_CLOSE:
		return NewEntryDlg_OnClose (hWnd, wParam, lParam);
	case WM_COMMAND:
		return NewEntryDlg_OnCommand (hWnd, wParam, lParam);
	case WM_INITDIALOG:
		return NewEntryDlg_OnInitDialog (hWnd, wParam, lParam);
	case WM_TIMER:
		return NewEntryDlg_OnTimer (hWnd, wParam, lParam);

	case WM_CTLCOLORDLG:
	//case WM_CTLCOLORLISTBOX:
	//case WM_CTLCOLOREDIT:
	case WM_CTLCOLORSTATIC:
		SetBkMode((HDC)wParam, TRANSPARENT);
		return (LRESULT)::GetStockObject(NULL_BRUSH);

	case WM_PAINT:
		HBITMAP hBmp;
		hBmp = LoadBitmap ( hInstance, (LPCSTR)IDB_NEW_ENTRY );	// tlo
		HDC hdcScreen, hdc;
		hdcScreen = GetDC ( GetDesktopWindow() );
		hdc = CreateCompatibleDC ( hdcScreen );
		ReleaseDC ( GetDesktopWindow(), hdcScreen );
		SelectObject ( hdc, hBmp );

		BITMAPINFOHEADER bmi;
		memset(&bmi, 0, sizeof(bmi));
		bmi.biSize = sizeof(BITMAPINFOHEADER);
		GetDIBits(hdc, hBmp, 0, 1, NULL, (BITMAPINFO *)&bmi,  DIB_RGB_COLORS);

		PAINTSTRUCT ps;
		BeginPaint ( hWnd, &ps );
		BitBlt ( ps.hdc, 0, 0, bmi.biWidth, bmi.biHeight, hdc, 0, 0, SRCCOPY );
		EndPaint( hWnd, &ps );

		DeleteDC ( hdc );
		return 0;


   default:
       return FALSE;
   }

return DefDlgProc(hWnd, msg, wParam, lParam);
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Serdeczne dzięki za odpowiedź ;)

Ale czy mógłbym poprosić o jakiś przykład kodu ??? Bo zupełny świerzak w tym WinAPI jestem ;/ Dziś dopiero zacząłem naukę tego wynalazku i usiłuję zrobić przykładowy program ;)

 

EDIT: Nie ważne widzę, że ktoś mnie uprzedił zanim posta wysłałem :D

 

EDIT2: Jednak mam jeszcze pyt... czy nie da się tego prościej przedstawić? Póki co nie chce mieć przeźroczystych kontrolek, a jedynie wczytać tło z pliku.bmp, jest może na to jakiś krótszy prostszy kod??? Prosiłbym o przedstawianie przykładu z wczytaniem takiego pliku, bo z tego co widzę wyżej to nie ma tam żadnej lokalizacji pliku.bmp więc jak ma być on wczytany ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Spoko, ja głownie w WinAPI programuje.

 

Troche mało danych podałeś :)

 

Jaki kompilator?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kompilator: GNU GCC z Code::Blocks

Wiem, że może jestem szybki z tą nauką WinAPI, bo C++ ucze się od miesiąca a że zaczeły mnie nudzić konsolowe apki to sie za to zabrałem :D Jeśli chcesz to mogę podać kod źródłowy który napisałem ;) i może do tego byś mi to jakoś wstawił i wytłumaczył ? Byłbym bardzo wdzięczny ;)

 

PS: Chodzi mi o to, że chcę, żeby moje okienko nie było białe, tylko żeby te tło wypełniał jakiś plik .jpeg itp.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz podesłać kod apki, co prawda korzystam z Visual Studio 2010, ale to nie jest problem :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz podesłać kod apki, co prawda korzystam z Visual Studio 2010, ale to nie jest problem :)

#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND g_hPrzycisk;
HWND g_hPrzycisk2;
HWND g_hPrzycisk3;
HDC kon;
PAINTSTRUCT ps;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{

   // WYPEŁNIANIE STRUKTURY
   WNDCLASSEX wc;
   wc.cbSize = sizeof( WNDCLASSEX );
   wc.style = 0;
   wc.lpfnWndProc = WndProc;
   wc.cbClsExtra = 0;
   wc.cbWndExtra = 0;
   wc.hInstance = hInstance;
   wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   wc.hCursor = LoadCursor( NULL, IDC_ARROW );
   wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName = NULL;
   wc.lpszClassName = NazwaKlasy;
   wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );

   // REJESTROWANIE KLASY OKNA
   if( !RegisterClassEx( & wc ) )
   {
       MessageBox( NULL, "Blad w ladowaniu okna!", "Blad!",
       MB_ICONEXCLAMATION | MB_OK );
       return 1;
   }

   // TWORZENIE OKNA
   HWND hwnd;
   hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Pierwsza apka", WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL );



   // przyciski
   g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Usuń pliki tymczasowe", WS_CHILD | WS_VISIBLE,
   1, 30, 160, 40, hwnd, NULL, hInstance, NULL );
   //
   g_hPrzycisk2 = CreateWindowEx( 0, "BUTTON", "Wyczyść cache DNS!", WS_CHILD | WS_VISIBLE,
   1, 80, 160, 40, hwnd, NULL, hInstance, NULL );
   //
   g_hPrzycisk3 = CreateWindowEx( 0, "BUTTON", "Wyczyść wszystko na raz!", WS_CHILD | WS_VISIBLE,
   1, 130, 180, 40, hwnd, NULL, hInstance, NULL );

   //koniec (przyciski)

   if( hwnd == NULL )
   {
       MessageBox( NULL, "Wystąpił błąd podczas uruchamiania aplikacji!", "Błąd!", MB_ICONEXCLAMATION );
       return 1;
   }

   ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
   UpdateWindow( hwnd );

   // Pętla komunikatów
   while( GetMessage( & Komunikat, NULL, 0, 0 ) )
   {
       TranslateMessage( & Komunikat );
       DispatchMessage( & Komunikat );
   }
   return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
   switch( msg )
   {
   case WM_CLOSE:
       DestroyWindow( hwnd );
       break;

   case WM_DESTROY:
       PostQuitMessage( 0 );
       break;

   case WM_COMMAND:
   if(( HWND ) lParam == g_hPrzycisk )
   system ("del %temp% /Q/S");
   if(( HWND ) lParam == g_hPrzycisk )
   MessageBox( hwnd, "Usunięto pliki tymczasowe!", "INFO", MB_ICONINFORMATION );
   //
   if(( HWND ) lParam == g_hPrzycisk2 )
   system ("ipconfig /flushdns");
   if(( HWND ) lParam == g_hPrzycisk2 )
   MessageBox( hwnd, "Wyczyszczono cache DNS!", "INFO", MB_ICONINFORMATION );
   //
   if(( HWND ) lParam == g_hPrzycisk3 )
   system ("ipconfig /flushdns");
   if(( HWND ) lParam == g_hPrzycisk3 )
   system ("del %temp% /Q/S");
   if(( HWND ) lParam == g_hPrzycisk3 )
   MessageBox( hwnd, "Wyczyszczono wszystko!", "INFO", MB_ICONINFORMATION );
   break;

   //

   //NAPISY
   case WM_PAINT:
   kon = BeginPaint( hwnd, & ps );
   TextOut( kon, 3, 5, "MENU:", 5 );
   EndPaint( hwnd, & ps );
   break;


       default:
       return DefWindowProc( hwnd, msg, wParam, lParam );
   }

   return 0;
}

 

To by było tyle :P. To mój pierwszy program w API, który dziś wystukałem :) To co i gdzie tu dodać :) ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znacznie szybciej pisze się kod pod tzw. Dialogi wykorzystując zasoby (resource, plik .RC), następnie funkcje WinAPI "DialoBox" do jej wywołania, jedynie co pozostaje to "WndProc" do obsługi komunikatów. W Code::Blocks też powinien być GUI w IDE do tworzenia okien, dopada wtedy znaczna część kodu i skupiasz się tylko na pisaniu, a nie programowania każdego z przycisków z osobna:) Chyba, że chcesz zaprogramować własną kontrolkę, to wtedy trzeba użyć "CreateWindowEx".

 

Utwórz okno w zasobach o ID = IDD_MAINDIALOG, dodaj dwa przyciski "OK" o ID = IDOK oraz "Zamknij" o ID = IDCANCEL, następnie dodaj bitmapę o ID = IDB_BITMAPA

 

Oto przykładowy, połączony kod:

 

#include <Windows.h>
#include <stdio.h>


LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);


HINSTANCE hInstance;


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevInstance, LPSTR cmdLine, int nCmdShow)
{
       hInstance = hInst;

       DialogBox( hInstance, (LPCTSTR)IDD_MAINDIALOG, 0, (DLGPROC)MainDlgProc );

       ExitProcess(0);
       return 0;
}


LRESULT         MainDlg_OnInitDialog (HWND hWnd, WPARAM wParam, LPARAM lParam)
{
       // inicjalizacja okna
       return TRUE;
}


LRESULT         MainDlg_OnCommand (HWND hWnd, WPARAM wParam, LPARAM lParam)
{
       switch (LOWORD(wParam))
   {
               case IDOK:
                       MessageBox ( hWnd, "Komunikat", "Tytul", MB_ICONINFORMATION );
                       break;

               // zamykamy okno..
               case IDCANCEL:
                       SendMessage(hWnd, WM_CLOSE, -1, -1);
                       break;

       }

       return 0;
}


LRESULT         MainDlg_OnClose (HWND hWnd, WPARAM wParam, LPARAM lParam)
{
       EndDialog(hWnd,1);
       return 0;
}


LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch (msg)
   {
               case WM_CLOSE:
                       return MainDlg_OnClose (hWnd, wParam, lParam);
               case WM_COMMAND:
                       return MainDlg_OnCommand (hWnd, wParam, lParam);
               case WM_INITDIALOG:
                       return MainDlg_OnInitDialog (hWnd, wParam, lParam);

	case WM_CTLCOLORDLG:
               //case WM_CTLCOLORLISTBOX:
               //case WM_CTLCOLOREDIT:
               case WM_CTLCOLORSTATIC:
                       SetBkMode((HDC)wParam, TRANSPARENT);
                       return (LRESULT)::GetStockObject(NULL_BRUSH);

               case WM_PAINT:
                       HBITMAP hBmp;
                       hBmp = LoadBitmap ( hInstance, (LPCSTR)IDB_BITMAPA ); // tlo
                       HDC hdcScreen, hdc;
                       hdcScreen = GetDC ( GetDesktopWindow() );
                       hdc = CreateCompatibleDC ( hdcScreen );
                       ReleaseDC ( GetDesktopWindow(), hdcScreen );
                       SelectObject ( hdc, hBmp );

                       BITMAPINFOHEADER bmi;
                       memset(&bmi, 0, sizeof(bmi));
                       bmi.biSize = sizeof(BITMAPINFOHEADER);
                       GetDIBits(hdc, hBmp, 0, 1, NULL, (BITMAPINFO *)&bmi,  DIB_RGB_COLORS);

                       PAINTSTRUCT ps;
                       BeginPaint ( hWnd, &ps );
                       BitBlt ( ps.hdc, 0, 0, bmi.biWidth, bmi.biHeight, hdc, 0, 0, SRCCOPY );
                       EndPaint( hWnd, &ps );

                       DeleteDC ( hdc );
                       return 0;


   default:
       return FALSE;
   }

       return DefDlgProc(hWnd, msg, wParam, lParam);
}

 

Pamiętaj aby dodać do zasobów bitmapę o ID=IDB_BITMAPA

 

 

Zmodyfikowany kod wygląda następująco :

 

#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND g_hPrzycisk;
HWND g_hPrzycisk2;
HWND g_hPrzycisk3;
HDC kon;
PAINTSTRUCT ps;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{

   // WYPEŁNIANIE STRUKTURY
   WNDCLASSEX wc;
   wc.cbSize = sizeof( WNDCLASSEX );
   wc.style = 0;
   wc.lpfnWndProc = WndProc;
   wc.cbClsExtra = 0;
   wc.cbWndExtra = 0;
   wc.hInstance = hInstance;
   wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   wc.hCursor = LoadCursor( NULL, IDC_ARROW );
   wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName = NULL;
   wc.lpszClassName = NazwaKlasy;
   wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );

   // REJESTROWANIE KLASY OKNA
   if( !RegisterClassEx( & wc ) )
   {
       MessageBox( NULL, "Blad w ladowaniu okna!", "Blad!",
       MB_ICONEXCLAMATION | MB_OK );
       return 1;
   }

   // TWORZENIE OKNA
   HWND hwnd;
   hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Pierwsza apka", WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL );



   // przyciski
   g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Usuń pliki tymczasowe", WS_CHILD | WS_VISIBLE,
   1, 30, 160, 40, hwnd, NULL, hInstance, NULL );
   //
   g_hPrzycisk2 = CreateWindowEx( 0, "BUTTON", "Wyczyść cache DNS!", WS_CHILD | WS_VISIBLE,
   1, 80, 160, 40, hwnd, NULL, hInstance, NULL );
   //
   g_hPrzycisk3 = CreateWindowEx( 0, "BUTTON", "Wyczyść wszystko na raz!", WS_CHILD | WS_VISIBLE,
   1, 130, 180, 40, hwnd, NULL, hInstance, NULL );

   //koniec (przyciski)

   if( hwnd == NULL )
   {
       MessageBox( NULL, "Wystąpił błąd podczas uruchamiania aplikacji!", "Błąd!", MB_ICONEXCLAMATION );
       return 1;
   }

   ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
   UpdateWindow( hwnd );

   // Pętla komunikatów
   while( GetMessage( & Komunikat, NULL, 0, 0 ) )
   {
       TranslateMessage( & Komunikat );
       DispatchMessage( & Komunikat );
   }
   return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
   switch( msg )
   {
   case WM_CLOSE:
       DestroyWindow( hwnd );
       break;

   case WM_DESTROY:
       PostQuitMessage( 0 );
       break;

   case WM_COMMAND:
   if(( HWND ) lParam == g_hPrzycisk )
   system ("del %temp% /Q/S");
   if(( HWND ) lParam == g_hPrzycisk )
   MessageBox( hwnd, "Usunięto pliki tymczasowe!", "INFO", MB_ICONINFORMATION );
   //
   if(( HWND ) lParam == g_hPrzycisk2 )
   system ("ipconfig /flushdns");
   if(( HWND ) lParam == g_hPrzycisk2 )
   MessageBox( hwnd, "Wyczyszczono cache DNS!", "INFO", MB_ICONINFORMATION );
   //
   if(( HWND ) lParam == g_hPrzycisk3 )
   system ("ipconfig /flushdns");
   if(( HWND ) lParam == g_hPrzycisk3 )
   system ("del %temp% /Q/S");
   if(( HWND ) lParam == g_hPrzycisk3 )
   MessageBox( hwnd, "Wyczyszczono wszystko!", "INFO", MB_ICONINFORMATION );
   break;

case WM_CTLCOLORDLG:
//case WM_CTLCOLORLISTBOX:
       //case WM_CTLCOLOREDIT:
       case WM_CTLCOLORSTATIC:
       	SetBkMode((HDC)wParam, TRANSPARENT);
               return (LRESULT)::GetStockObject(NULL_BRUSH);

case WM_PAINT:
	HBITMAP hBmp;
        hBmp = LoadBitmap ( hInstance, (LPCSTR)IDB_BITMAPA ); // tlo
       	HDC hdcScreen, hdc;
        hdcScreen = GetDC ( GetDesktopWindow() );
       	hdc = CreateCompatibleDC ( hdcScreen );
        ReleaseDC ( GetDesktopWindow(), hdcScreen );
        SelectObject ( hdc, hBmp );

        BITMAPINFOHEADER bmi;
        memset(&bmi, 0, sizeof(bmi));
        bmi.biSize = sizeof(BITMAPINFOHEADER);
        GetDIBits(hdc, hBmp, 0, 1, NULL, (BITMAPINFO *)&bmi,  DIB_RGB_COLORS);

        PAINTSTRUCT ps;
        BeginPaint ( hWnd, &ps );
        BitBlt ( ps.hdc, 0, 0, bmi.biWidth, bmi.biHeight, hdc, 0, 0, SRCCOPY );
	TextOut( kon, 3, 5, "MENU:", 5 );
        EndPaint( hWnd, &ps );

        DeleteDC ( hdc );
	break;

       default:
       return DefWindowProc( hwnd, msg, wParam, lParam );
   }

   return 0;
}

 

Pozdrawiam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Okej :) W zasadzie to zasobów używam tylko do tego żeby program miał ikonkę :)

Więc co nieco o tym wiem :D

 

EDIT:

Mam prośbę, żebyś wpisał mi do tego oryginalnego kodu te wczytanie tła ;) A jako alternatywę dał ten krótszy kod ;) Bo się nie połapie ;p

 

 

 

EDIT2: Może jestem tępy, ale nie za bardzo wiem jak to zrobić :E. Bardzo cię proszę, abyś wstawił mi to do tego mojego wcześniejszego kodu pomimo że jest dłuższy z tym CreateWindowEx , bo ucze się tego 1 dzien i nie za bardzo łapię ;/.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...