Skocz do zawartości

[WinAPI]Problem z uchwytem pędzla tła


Override

Polecane posty

Mam taki problem jak w temacie. Nie będę się rozpisywał na ten temat, podam tylko parę informacji.

 

#include <windows.h>

CONST CHAR ClassName[] = "T";

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow){
   WNDCLASSEX wa;

   wa.hInstance = hInst;
   wa.lpszClassName = ClassName;
   wa.lpfnWndProc = DefWindowProc;
   wa.style = CS_DBLCLKS;
   wa.cbSize = sizeof(WNDCLASSEX);
   wa.hIcon = LoadIcon(0,IDI_APPLICATION);
   wa.hIconSm = LoadIcon(0,IDI_APPLICATION);
   wa.hCursor = LoadCursor(0,IDC_ARROW);
   wa.lpszMenuName = 0;
   wa.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wa.cbWndExtra = 0;
   wa.cbClsExtra = 0;
   if(RegisterClassEx(&wa) == 0) return 0;

   HWND Okno = CreateWindowEx(0, ClassName, "Tytul‚ okna", WS_OVERLAPPEDWINDOW, 50, 50, 100, 100, 0, 0, hInst, 0);
   ShowWindow(Okno, SW_SHOW);

   MSG msgs;
   while(GetMessage(&msgs, 0, 0, 0)){
       TranslateMessage(&msgs);
       DispatchMessage(&msgs);
   }

   return msgs.wParam;
}$,Z0jx+$jKŁyĘ-jH)][K[Y[YY[H   MŃ]ÓX
       NOOHZ[[YH[OO_

 

Używam kopilatora MinGW, a edytora Code::Blocks. Proszę o pomoc.

Link do komentarza
Udostępnij na innych stronach

Aby nie zaśmiecać forum napiszę w tym temacie.

 

Wie ktoś dlaczego mi niemoże znowu tego skompilować.

 

#include <DirectX/ddraw.h>
#include <windows.h>

CONST CHAR ClassName[] = "DirectDraw";

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wPar,LPARAM lPar){
   switch(msg){
       case WM_PAINT:
       break;
       case WM_CLOSE:
           PostQuitMessage(0);
       break;
       default:
           return DefWindowProc(hwnd,msg,wPar,lPar);
   }
   return 0;
}

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow){
   WNDCLASSEX wa;

   wa.hInstance = hInst;
   wa.lpszClassName = ClassName;
   wa.lpfnWndProc = WndProc;
   wa.style = CS_DBLCLKS;
   wa.cbSize = sizeof(WNDCLASSEX);
   wa.hIcon = LoadIcon(hInst,"01");
   wa.hIconSm = LoadIcon(hInst,"01");
   wa.hCursor = LoadCursor(0,IDC_ARROW);
   wa.lpszMenuName = 0;
   wa.hbrBackground = (HBRUSH) (COLOR_WINDOW + 13);
   wa.cbWndExtra = 0;
   wa.cbClsExtra = 0;
   if(RegisterClassEx(&wa) == 0) return 0;

   HWND Okno = CreateWindowEx(0, ClassName, "DirectDraw", WS_POPUP, 50, 50, 100, 100, 0, 0, hInst, 0);
   ShowWindow(Okno, SW_SHOW);

   LPDIRECTDRAW lpDD = NULL;

   if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) MessageBox(HWND_DESKTOP, "Treść komunikatu", "Tytuł komunikatu", MB_OK);

   lpDD->SetCooperativeLevel(Okno, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
   lpDD->SetDisplayMode(1280, 1050, 32);

   MSG msgs;
   while(GetMessage(&msgs, 0, 0, 0)){
       TranslateMessage(&msgs);
       DispatchMessage(&msgs);
   }

   return msgs.wParam;

   return 0;
}

Link do komentarza
Udostępnij na innych stronach

Używam kompilatora MinGW. Pobrałem najnowsze biblioteki DirectX SDK, zainstalowałem, odpowiednie pliki skopiowałem do katalogu "include\DirectX" (skopiowałem pliki nagłówkowe), a do "lib\DirectX" pliki *.lib.

 

Niewiem co źle zrobiłem ale sądzę że wszystko dobrze.

Link do komentarza
Udostępnij na innych stronach

#include <ddraw.h>
#include <windows.h>
#include "keys.h"

CONST CHAR ClassName[] = "DirectDraw";

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wPar,LPARAM lPar){
   switch(msg){
       case WM_PAINT:
       break;
       case WM_CLOSE:
           PostQuitMessage(0);
       break;
       case WM_KEYDOWN:
           switch((int)wPar){
               case VK_ESCAPE:
                   PostQuitMessage(0);
               break;
           }
       break;
       default:
           return DefWindowProc(hwnd,msg,wPar,lPar);
   }
   return 0;
}

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow){
   WNDCLASSEX wa;

   wa.hInstance = hInst;
   wa.lpszClassName = ClassName;
   wa.lpfnWndProc = WndProc;
   wa.style = CS_DBLCLKS;
   wa.cbSize = sizeof(WNDCLASSEX);
   wa.hIcon = LoadIcon(hInst,"01");
   wa.hIconSm = LoadIcon(hInst,"01");
   wa.hCursor = LoadCursor(0,IDC_ARROW);
   wa.lpszMenuName = 0;
   wa.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wa.cbWndExtra = 0;
   wa.cbClsExtra = 0;
   if(RegisterClassEx(&wa) == 0) return 0;

   HWND Okno = CreateWindowEx(0, ClassName, "DirectDraw", WS_POPUP, 50, 50, 100, 100, 0, 0, hInst, 0);
   ShowWindow(Okno, SW_SHOW);

   LPDIRECTDRAW lpDD = NULL;
   LPDIRECTDRAWSURFACE lpDDSEkran = NULL;

   if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) MessageBox(HWND_DESKTOP, "Treść komunikatu", "Tytuł komunikatu", MB_OK);

   lpDD->SetCooperativeLevel(Okno, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
   lpDD->SetDisplayMode(1280, 1050, 32);

   DDSURFACEDESC ddsd;
   ZeroMemory(&ddsd, sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);
   ddsd.dwFlags = DDSD_CAPS;
   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

   lpDD->CreateSurface(&ddsd,&lpDDSEkran,NULL);

   HDC hdc, pomocniczy;
   HBITMAP hBMP;
   hBMP = (HBITMAP) LoadImage(NULL, "01.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
   BITMAP bmp;
   GetObject(hBMP ,sizeof(bmp), &bmp);

   pomocniczy = CreateCompatibleDC(NULL);

   SelectObject(pomocniczy, hBMP);
   if (lpDD->GetDC(&hdc) == DD_OK){
       BitBlt(hdc,0,0, bmp.bmWidth, bmp.bmHeight, pomocniczy,0,0,SRCCOPY);
       lpDD->ReleaseDC(hdc);
   }

   DeleteDC(pomocniczy);
   DeleteObject(hBMP);

   MSG msgs;
   while(GetMessage(&msgs, 0, 0, 0)){
       TranslateMessage(&msgs);
       DispatchMessage(&msgs);
   }

   lpDD->RestoreDisplayMode();
   if (lpDDSEkran!=NULL) lpDDSEkran->Release();
   if(lpDD!=NULL) lpDD->Release();

   return msgs.wParam;
}%ĘipÓÓF&V7DG&rFV'VrÓÓ3b3#F7VVG2ćB6WGFćw2b3#fW'&FRb3#ŚRFVVGb3#2b3#F&V7DG&rb3#ść7gVć7Fb3cBv5D4U5D4U4\"Bb33ł3b3#F7VVG2ćB6WGFćw2b3#fW'&FRb3#ŚRFVVGb3#2b3#F&V7DG&rb3#ść7s'ĆW'b337G'V7BF&V7DG&rb332ćV&W\"ćVBb33vWDD2b333b3#F7VVG2ćB6WGFćw2b3#fW'&FRb3#ŚRFVVGb3#2b3#F&V7DG&rb3#ść7sGĆW'b337G'V7BF&V7DG&rb332ćV&W\"ćVBb33&VĆV6TD2b33ÓÓ'VĆBfć6VC\"W'&'2v&ććw2ÓÓ

 

I znowu problem. Dodałem wszystkie potrzebne biblioteki, więc sądzę, że to niejest wina bibliotek.

Może mi ktoś powiedzieć co jest nie tak i czy to może być wina bibliotek DirectX SDK, bo ja mam najnowsze biblioteki, czyli Microsoft DirectX SDK (March 2009).

Link do komentarza
Udostępnij na innych stronach

Wysłało po prostu bitmapę do uchwytu obiektu, a nie do ekranu.

Dlatego wyświetlało że niema w pamięci struktury.

 

A teraz inny problem.

Bitmapa została wczytana, raz zauwarzyłem jak ją wyświetliło na milisekundę, ale potem był biały ekran. Kod jest poprawny.

Ta wysoka rozdzielczość to dlatego, że mam duży monitor i niechciałem dawać mniejszej, aby mi się długo ekran nie przełanczał pomiędzy rozdzielczościami.

 

#include <ddraw.h>
#include <windows.h>
#include "keys.h"

CONST CHAR ClassName[] = "DirectDraw";

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wPar,LPARAM lPar){
   switch(msg){
       case WM_PAINT:
       break;
       case WM_CLOSE:
           PostQuitMessage(0);
       break;
       case WM_KEYDOWN:
           switch((int)wPar){
               case VK_ESCAPE:
                   PostQuitMessage(0);
               break;
           }
       break;
       default:
           return DefWindowProc(hwnd,msg,wPar,lPar);
   }
   return 0;
}

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow){
   WNDCLASSEX wa;

   wa.hInstance = hInst;
   wa.lpszClassName = ClassName;
   wa.lpfnWndProc = WndProc;
   wa.style = CS_DBLCLKS;
   wa.cbSize = sizeof(WNDCLASSEX);
   wa.hIcon = LoadIcon(hInst,"01");
   wa.hIconSm = LoadIcon(hInst,"01");
   wa.hCursor = LoadCursor(0,IDC_ARROW);
   wa.lpszMenuName = 0;
   wa.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wa.cbWndExtra = 0;
   wa.cbClsExtra = 0;
   if(RegisterClassEx(&wa) == 0) return 0;

   HWND Okno = CreateWindowEx(0, ClassName, "DirectDraw", WS_POPUP, 50, 50, 100, 100, 0, 0, hInst, 0);
   ShowWindow(Okno, SW_SHOW);

   LPDIRECTDRAW lpDD = NULL;
   LPDIRECTDRAWSURFACE lpDDSEkran = NULL;

   if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) MessageBox(HWND_DESKTOP, "Nie dało się utworzyć obiektu DD!", "Błąd", MB_OK);

   lpDD->SetCooperativeLevel(Okno, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
   lpDD->SetDisplayMode(1280, 1050, 32);

   DDSURFACEDESC ddsd;
   ZeroMemory(&ddsd, sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);
   ddsd.dwFlags = DDSD_CAPS;
   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

   if(lpDD->CreateSurface(&ddsd,&lpDDSEkran,NULL) != DD_OK) MessageBox(HWND_DESKTOP, "Nie dało się utworzyć bufera ekranu!", "Błąd", MB_OK);

   HBITMAP hBMP;
   hBMP = (HBITMAP) LoadImage(NULL, "01.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

   if(hBMP == NULL) MessageBox(HWND_DESKTOP, "Nie dało się wczytać bitmapy!", "Błąd", MB_OK);



   HDC kPomoc = CreateCompatibleDC(NULL);
   SelectObject(kPomoc, hBMP);

   HDC hdc;
   if(lpDDSEkran->GetDC(&hdc) == DD_OK){
       BitBlt(hdc, 0, 0, 300, 225, kPomoc, 0, 0, SRCCOPY);
       lpDDSEkran->ReleaseDC(hdc);
   }

   DeleteDC(kPomoc);
   DeleteObject(hBMP);

   MSG msgs;
   while(GetMessage(&msgs, 0, 0, 0)){
       TranslateMessage(&msgs);
       DispatchMessage(&msgs);
   }

   lpDD->RestoreDisplayMode();
   if (lpDDSEkran!= NULL) lpDDSEkran->Release();
   if(lpDD != NULL) lpDD->Release();

   return msgs.wParam;
}

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...