我正在VC++
中处理一个开源项目,并希望更改静态控件的背景色。
hwndRenderMessage = CreateWindow(TEXT("STATIC"), Str("MainWindow.BeginMessage"),
WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|SS_CENTER,
0, 0, 0, 0, hwndRenderFrame, NULL, hinstMain, NULL);
SendMessage(hwndRenderMessage, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
此控件的父控件为
hwndRenderFrame = CreateWindow(OBS_RENDERFRAME_CLASS, NULL,
WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
0, 0, 0, 0,
hwndMain, NULL, hinstMain, NULL);
if(!hwndRenderFrame)
CrashError(TEXT("Could not create render frame"));
那么如何改变静态控件的背景色。
我搜索它并得到相同的答案使用
case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(0,0,0));
SetBkColor(hdcStatic, RGB(230,230,230));
return (INT_PTR)CreateSolidBrush(RGB(230,230,230));
}
但是文件中没有开关箱,那么该怎么办呢?事实上,我在c#上工作,但这是我第一次在vc++上工作
发布于 2013-11-20 05:47:07
我从sourceforge下载了OBS源代码。
窗口Proc是位于WindowStuff.cpp中的OBS::RenderFrameProc。
在proc的底部(但在“返回”之前),添加:
else if(message == WM_CTLCOLORSTATIC ) {
// HERE YOUR CODE
}
编辑:更改按钮背景
首先,一个建议是:“不要那样做”。按钮是windows中非常重要和常见的组件,它们的外观和感觉在所有应用程序中都应该是一致的。用户可以从整体上对桌面进行定制,这包括“可访问性”问题和行为。想要用自己的“特殊方式”去做的应用程序只会带来问题。
第二,尝试下面的代码来更改“设置.”按钮背景到难看的绿色:在交换机(WParam)中的OBS::OBSProc中的WM_NOTIFY
消息处理中添加一个大小写
case ID_SETTINGS:
if(nmh.code == NM_CUSTOMDRAW)
{
LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)lParam;
if (lpcd->dwDrawStage == CDDS_PREPAINT )
{
SetDCBrushColor(lpcd->hdc, RGB(0, 255, 0));
SelectObject(lpcd->hdc, GetStockObject(DC_BRUSH));
LONG lBorders = 0;
LONG lElipse = 5;
RoundRect(lpcd->hdc, lpcd->rc.left + lBorders, lpcd- rc.top + lBorders,
lpcd->rc.right - lBorders, lpcd->rc.bottom - lBorders, lElipse, lElipse);
return CDRF_NOTIFYPOSTPAINT;
}
}
break;
另一种选择,具有更标准的边界:
SetDCBrushColor(lpcd->hdc, RGB(0, 255, 0));
SetDCPenColor(lpcd->hdc, RGB(0, 255, 0));
SelectObject(lpcd->hdc, GetStockObject(DC_BRUSH));
SelectObject(lpcd->hdc, GetStockObject(DC_PEN));
LONG lBorders = 3;
要完成,您可能需要检查lpcd的uItemState成员,以获得CDIS_HOT标志,并相应地更改颜色。
发布于 2013-11-20 04:01:14
你需要把这段代码放到窗口程序中。窗口过程如下所示:
LRESULT CALLBACK RenderMessageWndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_CTLCOLORSTATIC:
// your code goes here
return ....
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
您需要对您的窗口进行子类化,以便它使用这个WndProc
。如下所示:
SetWindowLongPtr(hwndRenderMessage, GWLP_WNDPROC, (LONG_PTR)RenderMessageWndProc);
如果您不知道窗口过程是什么或子类是什么,那么您确实需要退一步学习一些基础知识。例如,Petzold的经典书籍编程Windows仍然是一个极好的起点。
https://stackoverflow.com/questions/20094483
复制