Controls werden nicht auf Windows XP angezeigt.
-
muss ich nachfragen, hab ja kein XP.
Kann es WM_PAINT oder an der Transparenz liegen?case WM_PAINT: hdcTarget = BeginPaint(hwnd, &ps); hdcBitmap = CreateCompatibleDC(hdcTarget); hbmOld = (HBITMAP)SelectObject(hdcBitmap, bmp_background); if(BitBlt((HDC)hdcTarget, 0, 0, 400, 400, hdcBitmap, 0, 0, SRCCOPY) == 0) { errorStream << TEXT("Failed to draw the bitmap! Error Code: ") << GetLastError(); MessageBox(hwnd, errorStream.str().c_str(), AppName.c_str(), MB_ICONERROR); DestroyWindow(hwnd); } SelectObject(hdcBitmap, hbmOld); DeleteDC(hdcBitmap); EndPaint(hwnd, &ps); return 0; case WM_CTLCOLORSTATIC: if((HWND)lParam == hwndEdit) return (LRESULT)RGB(255, 255, 255); SetBkMode((HDC)wParam, TRANSPARENT); SetTextColor((HDC)wParam, RGB(0, 0, 0)); if((HWND)lParam == hwndStaticDescr) SetTextColor((HDC)wParam, RGB(255, 127, 0)); return (LRESULT)hbrNULL;
-
Was hat dieser Code bitte jetzt mit Deinem Button zu tun?
WM_CTLCOLORSTATIC wird für Buttons nicht ausgelöst.
Aber warum malst Du den Hintergrund des Dialoges in WM_PAINT und nicht in WM_EARSEBKGND?
Bist Du sicher, dass dieser WM_PAINT Code Deine Controls nicht überschreibt.
-
aber dann würde es ja die Controls unter Windows 7 auch übermalen.
-
auf WinXp wird WM_CREATE gar nicht aufgerufen, wie kann das sein?
Und der CreateWindow aufruf vom Hauptfenster gibt nicht Null zurück.
-
oder doch wird es, lag nur daran, das nichtmal eine MessageBox angezeigt wird.
im Debugger konnte ich erkennen, dass der LastError bei MessageBox Error_CAN_NOT_FIND_WNDCLASSCan und ERROR_CLASS_DOES_NOT_EXIST.
was ist das für ein Blödsinn, eine MessageBox hat doch keine wndclass?
Das ist der Code, wie ich das Fenster erstelle:PlaySound(MAKEINTRESOURCE(IDR_WAVE1), hInstance, SND_RESOURCE | SND_ASYNC); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = AppName.c_str(); if(!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("RegisterClass failed. Maybe you don't have Windows NT?"), AppName.c_str(), MB_ICONERROR); return 0; } hwnd = CreateWindow(AppName.c_str(), AppName.c_str(), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { return 0; } ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;Stimmt doch alles?
Muss man im Linker irgendwie eintragen, dass es auch auf XP laufen soll?
-
Dieser Code ist soweit OK!
Was steht im WM_CREATE Code?BTW: Auch eine MessageBox hat natürlich eine Window Klasse!
Jedes Fenster hat eine!
-
Es fehlt der Aufruf von InitCommonControls/Ex. Danach geht es.
-
jo danke! So geht es

kann mir auch jemand erklären warum ich das brauche? Hab ich doch unter Windows XP auch nicht gebraucht bei buttons und so.
Im WM_CREATE sind nur die CreateWindow und ein LoadImage
-
das einzige das trotzdem nicht geht, ist, dass ich ein Bild auf einem Button hab und da nicht das Bild sondern nur der Button angezeigt wird aber das ist nicht so wichtig den kann ich auch entfernen. Also mit BS_SETIMAGE
-
WaveRacer schrieb:
kann mir auch jemand erklären warum ich das brauche?
Die neuen Buttons sind CommonControls. Du rufst aber nicht eine einzige Funktion aus der comctl.dll auf und damit wird sie (die Dll) nicht in den Prozess gemappt. Wenn Du jetzt InitCommonControls aufrufst (die Funktion, die laut Doku rein gar nichts macht), hast Du auf jeden Fall eine Abhängigkeit zur comctl.dll geschaffen und sichergestellt, dass die Dll geladen wird.
WaveRacer schrieb:
Hab ich doch unter Windows XP auch nicht gebraucht bei buttons und so.
Das habe ich aber auch schon anders erlebt. Es kann aber durchaus sein, dass irgendeine andere Dll die Abhängikeit hat und somit die erforderliche Dll geladen wurde.
-
jo danke! Das hat wohl der Button mit der Bitmap gebraucht denn ohne diesen läuft es auch InitCommonControls.
-
WaveRacer schrieb:
das einzige das trotzdem nicht geht, ist, dass ich ein Bild auf einem Button hab und da nicht das Bild sondern nur der Button angezeigt wird aber das ist nicht so wichtig den kann ich auch entfernen. Also mit BS_SETIMAGE
Mit BS_BITMAP und BS_SETIMAGE bekommst Du IIRC wieder einen Old-Style Button. Pack das Image lieber in eine ImageList und setze diese per BCM_SETIMAGELIST
Ansonsten unterstützen auch Buttons das CustomDraw-Feature.