如何动态修改CButton的风格(通过SetWindowLong)

linxi075 2003-11-13 06:20:33
我在对话框种有一个按钮:ID = IDOK
在WM_INITDIALOG消息函数中:

CWnd *pWnd = GetDlgItem(IDOK);
long lProc = GetWindowLong(pWnd->m_hWnd,GWL_WNDPROC);
// DWORD dwStyle = pWnd->GetStyle();
// dwStyle |= BS_OWNERDRAW;
// ::SendMessage(pWnd->m_hWnd,BM_SETSTYLE,dwStyle,TRUE);

SetWindowLong(pWnd->m_hWnd,GWL_WNDPROC,(long)&XPButtonWndProc);
XPButtonWndProc为我自己的处理函数;
可是怎么不进WM_DRAWITEM消息:

下面是我的Button绘制函数:
那位大侠帮忙看看,哪儿出错了,还是前面的SetWindowLong出错了?

LONG APIENTRY XPButtonWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
switch(uMsg)
{
case WM_CREATE:
break;
case WM_MOUSEMOVE:
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = hwnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}
break;
case WM_MOUSELEAVE:
m_bOver = FALSE;
m_bTracking = FALSE;
InvalidateRect(hwnd,NULL, FALSE);
return 0;
case WM_MOUSEHOVER:
m_bOver = TRUE;
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_DRAWITEM:
DrawButtonItem(hwnd,(int)wParam,(LPDRAWITEMSTRUCT)lParam);
return 0;
default:
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}



...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
linxi075 2003-11-14
  • 打赏
  • 举报
回复
WM_MEASUREITEM
WM_DRAWITEM
在我的回调函数里怎么都收不到。
回调函数见顶端。
wuxfBrave 2003-11-14
  • 打赏
  • 举报
回复
CButton *p = (CButton *)GetDlgItem(IDC_BUTTON1);
long style = GetWindowLong(p->m_hWnd, GWL_STYLE);
style |= BS_OWNERDRAW;
SetWindowLong(p->m_hWnd, GWL_STYLE, style);
p->Invalidate();
这样可以换为自绘风格
要放在前面

另外还需要处理消息WM_MEASUREITEM
linxi075 2003-11-14
  • 打赏
  • 举报
回复
To: aaasng(做一个好学生) (
按照你的做法还是不行。


我的问题是:XPButtonWndProc中不响应WM_DRAWITEM消息


linxi075 2003-11-14
  • 打赏
  • 举报
回复
谢谢: arvid_gs(west)执教,可是我用SPY也没有看见有 WM_MEASUREITEM
WM_DRAWITEM这两个消息
arvid_gs 2003-11-14
  • 打赏
  • 举报
回复
The WM_DRAWITEM message is sent to the owner window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo box, list box, or menu has changed.
这是msdn上关于WM_DRAWITEM 这个消息的描述,如果你看懂了就这只到为什么没有收到这个消息!
sent to the owner window of an owner-drawn button
是关键,意思是这个消息发给按钮所在的类的窗口,也就是父窗口!
aaasng 2003-11-13
  • 打赏
  • 举报
回复
WM_PAINT
aaasng 2003-11-13
  • 打赏
  • 举报
回复
CButton *p = (CButton *)GetDlgItem(IDC_BUTTON1);
long style = GetWindowLong(p->m_hWnd, GWL_STYLE);
style |= BS_OWNERDRAW;
SetWindowLong(p->m_hWnd, GWL_STYLE, style);
p->Invalidate();
这样可以换为自绘风格

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧