WTL COwnerDraw的有关问题!不能自绘
WTL COwnerDraw的问题!!!不能自绘。
我写个自绘按钮,但是没反应,哪位帮忙看下。
class CButtonEz
: public CWindowImpl <CButtonEz,CButton>
, public COwnerDraw <CButtonEz>
{
public:
CButtonEz();
~CButtonEz();
BEGIN_MSG_MAP(CButtonEz)
CHAIN_MSG_MAP_ALT(COwnerDraw <CButtonEz> ,1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
void DrawItem(LPDRAWITEMSTRUCT lpDrwStruct);
private:
HPEN m_hPen;
};
在一个对话框中使用,对话框如下定义
class CAboutDialog : public CDialogImpl <CAboutDialog>
{
public:
enum {IDD = IDD_ABOUTBOX};
BEGIN_MSG_MAP(CAboutDialog)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
MESSAGE_HANDLER(WM_CLOSE,OnClose)
COMMAND_ID_HANDLER(IDOK,OnOK)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
protected:
LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHandled)
{
m_wndBtnOK.SubclassWindow(GetDlgItem(IDOK));
m_wndBtnOK.SetWindowText(_T( "subclass "));
return TRUE;
}
LRESULT OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHandled)
{
EndDialog(0);
return 0;
}
LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtrl,BOOL& bHandled)
{
EndDialog(0);
return 0;
}
protected:
CButtonEz m_wndBtnOK;
};
我调试发现CButtonEz的 DrawItem函数根本没有被调用,不知为何?
------解决方案--------------------
你的按钮是自绘风格的吗? BS_OWNERDRAW
------解决方案--------------------
你是SubclassWindow的,所以光改这里不行,这个地方只对你CreateWindow时有效。
在你的对话框资源里找到IDOK这个按钮,把它设置成BS_OWNERDRAW。
我写个自绘按钮,但是没反应,哪位帮忙看下。
class CButtonEz
: public CWindowImpl <CButtonEz,CButton>
, public COwnerDraw <CButtonEz>
{
public:
CButtonEz();
~CButtonEz();
BEGIN_MSG_MAP(CButtonEz)
CHAIN_MSG_MAP_ALT(COwnerDraw <CButtonEz> ,1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
void DrawItem(LPDRAWITEMSTRUCT lpDrwStruct);
private:
HPEN m_hPen;
};
在一个对话框中使用,对话框如下定义
class CAboutDialog : public CDialogImpl <CAboutDialog>
{
public:
enum {IDD = IDD_ABOUTBOX};
BEGIN_MSG_MAP(CAboutDialog)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
MESSAGE_HANDLER(WM_CLOSE,OnClose)
COMMAND_ID_HANDLER(IDOK,OnOK)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
protected:
LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHandled)
{
m_wndBtnOK.SubclassWindow(GetDlgItem(IDOK));
m_wndBtnOK.SetWindowText(_T( "subclass "));
return TRUE;
}
LRESULT OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHandled)
{
EndDialog(0);
return 0;
}
LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtrl,BOOL& bHandled)
{
EndDialog(0);
return 0;
}
protected:
CButtonEz m_wndBtnOK;
};
我调试发现CButtonEz的 DrawItem函数根本没有被调用,不知为何?
------解决方案--------------------
你的按钮是自绘风格的吗? BS_OWNERDRAW
------解决方案--------------------
你是SubclassWindow的,所以光改这里不行,这个地方只对你CreateWindow时有效。
在你的对话框资源里找到IDOK这个按钮,把它设置成BS_OWNERDRAW。