Tab Control,已经子类化,怎样处理消息才能实现自绘?(纯SDK实现)

dmznc 2007-04-30 06:42:57
想实现的功能:
⒈ 获取及改变标签的背景色;
⒉ 获取及改变Tab页面的背景色;
⒊ 改变标签的字体;

经网上搜索,发现所有相关的资料都是从CTabCtrl类派生后实现。而我并不使用MFC,寻求SDK的实现方法。

部分消息:
WM_MOUSEMOVE
WM_MOUSELEAVE
TCN_SELCHANGING
TCN_SELCHANGE
TCM_SETCURSEL
WM_HSCROLL
WM_PAINT
WM_ERASEBKGND
WM_KILLFOCUS
WM_SETFOCUS

下面是我子类化后的处理代码,请帮忙修改一下:
// 父窗口过程
LRESULT CALLBACK CTabSub::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_ERASEBKGND:
{
RECT rc;
HBRUSH hBr;
GetClientRect(hDlg, &rc);
hBr = ::CreateSolidBrush(0xFF0000);
::FillRect((HDC)wParam, &rc, hBr);
DeleteObject(hBr);
return TRUE;
}

case WM_PAINT:
{
RECT rc;
HBRUSH hBr;
GetClientRect(hDlg, &rc);
rc.left += 100;
rc.bottom += 50;
hBr = ::CreateSolidBrush(0x00FF00);
::FillRect((HDC)wParam, &rc, hBr);
DeleteObject(hBr);
return TRUE;
}
}

return FALSE;
}

// 子窗口过程
LRESULT CALLBACK CtlProc(HWND hCtl, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_MOUSEMOVE:
{
CMsg::Show(1);
return TRUE;
}

}

return FALSE;
}
...全文
481 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-02-24
  • 打赏
  • 举报
回复
将控件设置TCS_OWNERDRAWFIXED风格,在父窗口响应WM_DRAWITEM消息来自绘。如果需要,再响应控件的WM_ERASEBKGND消息填充背景。
WillyWonka 2009-02-24
  • 打赏
  • 举报
回复
帮顶,其实控件也是窗口啊,获取窗口句柄调用UpdateWindow() Invalidate() 等等的重绘应该也可以吧?
偶很菜,在网吧答题中...
qinhaichao 2009-02-24
  • 打赏
  • 举报
回复
我现在也遇到同样的问题,继续寻找办法!
hys13love 2007-11-28
  • 打赏
  • 举报
回复

我现在也要解决SDK画窗口的问题,还要做TAB,有高手的交流一下
artcpp 2007-05-02
  • 打赏
  • 举报
回复
同样想法,子类化后,绘制起来很麻烦...
dmznc 2007-04-30
  • 打赏
  • 举报
回复
To: ringphone(临风)

WM_ERASEBKGND处理之后,根本没效果。

“CTabSub::DlgProc未处理的消息应该返回CallWindowProc”,由于这个子类化还有一个基类。如果“CTabSub::DlgProc 返回FALSE”,则基类负责CallWindowProc。

问题:我现在不知道如何改变背景色,标签(按钮)的背景色。请帮忙指点一下如何处理WM_ERASEBKGND,谢谢!
dmznc 2007-04-30
  • 打赏
  • 举报
回复
试了多次,还是不行。
谁能教教我?
ringphone 2007-04-30
  • 打赏
  • 举报
回复
WM_ERASEBKGND的处理是对的。
CTabSub::DlgProc未处理的消息应该返回CallWindowProc
设置字体可以发送WM_SETFONT消息
CathySun118 2007-04-30
  • 打赏
  • 举报
回复
帮顶
周江涛 2007-04-30
  • 打赏
  • 举报
回复
自绘应该是处理WM_NOTIFY 消息吧。
WM_NOTIFY
idCtrl = (int) wParam;
pnmh = (LPNMHDR) lParam;

mfc里我有段listCtrl自绘的代码,你参考一下。

看看SDK里有没有NMLVCUSTOMDRAW结构


void CDetailView::OnDrawLvDetail(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW *pLVCD = (NMLVCUSTOMDRAW*)pNMHDR;
*pResult = CDRF_DODEFAULT;

if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
{
LP_FILE_INFO pFileInfo = GetPointerByIndex(pLVCD->nmcd.dwItemSpec);
if (!pFileInfo)
return;

COLORREF crText;
if (pFileInfo->bRead == 0)
crText = RGB(255, 0, 0); //红字
else crText = RGB(0, 0, 0);

pLVCD->clrText = crText;
*pResult = CDRF_DODEFAULT;
}

return;
}
ringphone 2007-04-30
  • 打赏
  • 举报
回复
WM_ERASEBKGND处理之后背景色是变化的,不过我用的是GetStockObject(WHITE_BRUSH),不知是不是你DeleteObject的问题,试试把brush改成成员变量,构造时CreateSolidBrush,析构时才DeleteObject。或者是rect有问题,用GetWindowRect然后OffsetRect(&rc,-rc.left,-rc.top)

标签(按钮)的背景色必须在WM_PAINT里面绘制,自己把按钮画出来了。可以参考WIN2000源代码shell\comctl32\tab.c或网上其他类似代码。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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