我正在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 ++
答案 0 :(得分:1)
我从sourceforge下载了OBS源代码。
Window Proc是位于WindowStuff.cpp
中的OBS :: RenderFrameProc在proc的底部(但在“return”之前),添加:
else if(message == WM_CTLCOLORSTATIC ) {
// HERE YOUR CODE
}
编辑:更改按钮背景
首先,建议:“不要那样做”。按钮是Windows GUI非常重要和常见的组件,它们的外观应该在所有应用程序中保持一致。用户可以通过各种方式为桌面自定义内容,这包括“可访问性”问题和行为。想要以“自己的特殊方式”进行的应用程序只会带来问题。
其次,尝试使用此代码将“Setting ...”按钮背景更改为丑陋的绿色:在交换机(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标志,相应地更改颜色。
答案 1 :(得分:0)
您需要将该代码放在窗口过程中。窗口过程如下所示:
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”仍然是一个很好的起点。