Сабклассинг контролов на диалоговых окнах - проблема с фоном
От: -Deniska-  
Дата: 17.04.08 15:09
Оценка:
Ребята, есть вопрос по поводу сабклассинга контрола на диалоге. Никак не могу найти нигде решение.

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: Перенесено модератором из 'Прочее' — Кодт
Re: Сабклассинг контролов на диалоговых окнах - проблема с ф
От: Константин Л.  
Дата: 18.04.08 12:45
Оценка:
Здравствуйте, -Deniska-, Вы писали:

что за контрол сабкласишь? может он сам себя рисутет олько в WM_PAINT?
Re: Сабклассинг контролов на диалоговых окнах - проблема с ф
От: SaZ  
Дата: 21.04.08 15:44
Оценка:
Здравствуйте, -Deniska-, Вы писали:

D>Ребята, есть вопрос по поводу сабклассинга контрола на диалоге. Никак не могу найти нигде решение.


D>MS Studio 2005, C++

D>Вообщем, вопрос прост: почему контрол выводится на сером фоне (т.е. он не является прозрачным), хотя я перехватываю сообщение WM_ERASEBKGND:

D>case WM_ERASEBKGND:

D> return TRUE;
D>Хотя сообщения точно в функцию доходят (двойной клик работает).
D>Т.е., грубо говоря: я диалоговое окно отрисовываю белым фоном, а у контрола на этом диалоге перехватываю сообщение WM_ERASEBKGND и возвращаю true, но фон всё равно заливается серым.
D>В МСДНе пишется, что вроде как должно работать... странно...

WM_CTLCOLORSTATIC, если рисуешь на статике
SetBkMode( hdc, TRANSPARENT );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.