首先,这不是MFC。 这是我一直在研究的裁剪版GUI:
正如您所看到的,在选项卡控件(使用默认窗口的句柄)上方有一个位图图像,我将其称为“蓝色位图”我没有问题,它运行正常。 我遇到的问题是设置另一个位图(从磁盘上的位图文件)到子窗口的背景(更具体地说是选项卡控件子窗口),替换灰色。以下是我为尝试所做的一些事情,并将位图设置为子窗口(选项卡)的背景。
1)我使用与用于将蓝色位图分配给窗口的方法相同的方法,首先使用LoadImage导入位图,如下所示:
index->hbmBitmapBanner = (HBITMAP)LoadImage(index->hInstance,L"Images\\horizontal.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
然后在WM_PAINT消息中:
case WM_PAINT:
{
PAINTSTRUCT ps1;
if (BeginPaint(WINDOWHANDLE,&ps1))
{
HDC hdcBanner = CreateCompatibleDC(ps1.hdc);
HBITMAP hbmOldHorizontal = (HBITMAP)SelectObject(hdcBanner,index->hbmBitmapBanner); // banner
BitBlt(ps1.hdc,0,0,516,101,hdcBanner,5,0,SRCCOPY);
SelectObject(hdcBanner,hbmOldHorizontal);
DeleteDC(hdcBanner);
EndPaint(WINDOWHANDLE,&ps1);
}
break;
}
该代码成功地将蓝色位图设置到窗口,但没有将其他位图设置到窗口中(当然,蓝色位图的变量被替换为,大小和方向也发生了变化)。它只是没有在屏幕上显示位图,窗口保持不变,但没有功能失败。 ALSO ,当我交换文件位置时,它将位图加载到蓝色位图的位置,因此加载函数肯定没有失败。
2)使用上面的代码,我尝试将BeginPaint的第一个参数更改为选项卡控件框的窗口句柄,这再次证明没有用,并且窗口保持不变。我还尝试将BeginPaint的第一个参数更改为显示在信息选项卡上的子窗口,这导致子窗口(这是一个组合框)消失,但窗口上仍然没有出现位图。
3)作为最后的手段,我愚蠢地尝试在子窗口上使用此功能
SetClassLongPtr(tab->hTabIndex[0],GCLP_HBRBACKGROUND,(DWORD)GetStockObject(BLACK_BRUSH));
当然,它不起作用
如果有任何用处,我在窗口中创建标签的方式如下:
TCITEM tie = {0};
tab->hTab = CreateWindowEx(0,WC_TABCONTROL,L"",WS_CHILD | WS_VISIBLE,0,101,600,400,
WINDOWHANDLE,NULL,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWLP_HINSTANCE),NULL
);
是主标签控件,然后单独插入标签(即信息标签)
TCHAR pszTab1 [] = L"Information"; // tab1's text
tie.pszText = pszTab1; // the tab's text/caption
TabCtrl_InsertItem(tab->hTab, 0, &tie); // insert the tab
其他信息:除此之外,选项卡控件和窗口正在工作/交互完美。我只在一个选项卡上测试/尝试这个,因为我知道它是否在一个选项卡上工作,然后它可以在所有选项卡上工作,从而节省时间。
我有作为Windows第五版的编程,由Charles Petzold在我旁边作为参考,并且在位图上有一个相当大的部分,但他没有讨论将位图加载到子窗口,他最接近在菜单中使用位图,这与窗口完全不同。
答案 0 :(得分:3)
我认为这里的问题是Windows公共控件不通过主线程的窗口过程与您的应用程序交互,而是通过自己的(系统定义的)窗口过程。
因此,例如,当您的选项卡窗口重绘时,它不会响应WM_PAINT消息到达代码中定义的窗口过程。您应该能够通过检查传递给窗口过程的消息的窗口句柄(例如WM_PAINT)来验证自己是这样。
如果您希望“点击”公共控件的默认行为,您必须“子类化”它(请参阅here),但根据我的经验,尝试更改重绘行为通常会产生问题。< / p>
对于选项卡控件,最好的做法是创建一个子窗口数组,这些子窗口的大小与选项卡控件的客户区相同,并安排在任何时候显示的子窗口对应于所选的选项卡。
如果你正在使用C ++,你可以考虑创建一个基类来包装这些处理背景(位图)绘图的窗口。然后,您可以派生一系列包装器来处理每个单独的选项卡。我过去使用过这种方法,效果很好。
可能有用的是要记住,选项卡控件的选项卡不会扩展到整个控件的客户端区域,而只是字幕上的选项卡本身。我不记得细节,但我认为它们是由控件内部处理的,并且以任何方式操纵它们都是相当的技巧,即使控件是子类化的 - 可能是错误的。
希望有所帮助。
干杯,伊恩。