Ребята, есть вопрос по поводу сабклассинга контрола на диалоге. Никак не могу найти нигде решение.
MS Studio 2005, C++
Вообщем, вопрос прост: почему контрол выводится на сером фоне (т.е. он не является прозрачным), хотя я перехватываю сообщение WM_ERASEBKGND:
case WM_ERASEBKGND:
return TRUE;
Хотя сообщения точно в функцию доходят (двойной клик работает).
Т.е., грубо говоря: я диалоговое окно отрисовываю белым фоном, а у контрола на этом диалоге перехватываю сообщение WM_ERASEBKGND и возвращаю true, но фон всё равно заливается серым.
В МСДНе пишется, что вроде как должно работать... странно...
PS: ниже привожу код, а к сообщению прицепляю архив с проектом:
http://files.rsdn.ru/74309/background_of_control.zip.
#include <windows.h>
#include "resource.h"
// template bitmap
HBITMAP g_hBitmap = NULL;
#define PROP_STATIC_ORIGINAL_PROC TEXT("_Static_Original_Proc_")
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WindowStaticProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// main program
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return (int) DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
}
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
{
WNDPROC pfnOrigProc = (WNDPROC) ::GetWindowLong(::GetDlgItem(hDlg,IDC_TEXT1), GWL_WNDPROC);
::SetProp(::GetDlgItem(hDlg,IDC_TEXT1), PROP_STATIC_ORIGINAL_PROC, (HANDLE) pfnOrigProc);
::SetWindowLong(::GetDlgItem(hDlg,IDC_TEXT1), GWL_WNDPROC, (LONG) (LONG_PTR)WindowStaticProc1);
}
return TRUE;
case WM_DESTROY:
case WM_CLOSE:
EndDialog(hDlg,0);
return (TRUE);
case WM_PAINT:
{
PAINTSTRUCT ps;
::BeginPaint(hDlg, &ps);
RECT rc;
::GetClientRect(hDlg, &rc);
::Rectangle(ps.hdc, rc.left, rc.top, rc.right, rc.bottom);
::EndPaint(hDlg, &ps);
}
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
SendMessage(hDlg, WM_CLOSE, 0, 0);
return (TRUE);
case IDOK:
SendMessage(hDlg, WM_CLOSE, 0, 0);
return (TRUE);
}
}
return (FALSE);
}
LRESULT CALLBACK WindowStaticProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC pfnOrigProc = (WNDPROC) ::GetProp(hWnd, PROP_STATIC_ORIGINAL_PROC);
switch(uMsg)
{
case WM_LBUTTONDBLCLK:
::MessageBoxW(hWnd, L"DBLCLICK IN PROC!", L"YES!", 0);
return TRUE;
case WM_ERASEBKGND:
return TRUE;
}
return ::CallWindowProc(pfnOrigProc, hWnd, uMsg, wParam, lParam);
}
18.04.08 15:31: Перенесено модератором из 'Прочее' — Кодт