C++Win32,可以编辑所有者绘制的控件
C++ Win32, Can Edit Controls be Owner Drawn?
我正在尝试使对话框匹配。我已经全部通过了谷歌、随机测试等,甚至读到了一些无法做到的地方。
我所能做的是使用其中一条消息来设置字体和颜色,但对绘图本身却无能为力。
我认为它必须能够做到…
有人有什么想法吗?或者知道这件事吗?
http://imageshack.com/a/img832/5955/91m.png
看起来编辑控件不支持所有者绘制,但您仍然可以解决直接的问题。根据EDITTEXT的MSDN页面,默认情况下,资源文件中的编辑控件具有WS_BORDER
样式集。看起来你可以用这样的东西来摆脱它:
EDITTEXT IDC_EDIT1,17,51,136,14,ES_AUTOHSCROLL | NOT WS_BORDER
对于状态栏,您可以尝试使用具有自定义颜色的静态控件,而不是真正的状态栏。或者,您可以自己滚动,在资源文件中指定窗口类名,并确保在显示对话框之前注册该类。
更新:哇,状态栏的文档太糟糕了。不过,你可以自己画一个。遵循以下步骤:
// where hStatus is the HWND of a status bar...
// You must set simple mode to false, because simple mode doesn't
// support owner draw.
SendMessage(hStatus, SB_SIMPLE, FALSE, 0);
// I'm assuming 1 status bar part for demonstration. Setting the right edge
// for the 1 part to -1 make it take up the whole status bar.
int partWidths[] = { -1 };
SendMessage(hStatus, SB_PARTS, 1, reinterpret_cast<LPARAM>(partWidths));
// There is background stuff that stays behind even with owner draw,
// so you have to set the background color to black, too, to get rid of
// any appearance of borders.
SendMessage(hStatus, SB_SETBKCOLOR, 0, RGB(0, 0, 0));
// There is still a slim border that stays behind, so you need to set
// SBT_NOBORDERS in addition to SBT_OWNERDRAW. The 0 is the index of the
// status bar part. It could be anything between 0 and 255.
SendMessage(
hStatus,
SB_SETTEXT,
SBT_NOBORDERS | SBT_OWNERDRAW | 0,
reinterpret_cast<LPARAM>(_T("Status")));
从那里,您还必须处理状态栏的WM_DRAWITEM
。现在,至于为什么我说状态栏的文档很糟糕。。。
SB_SETTEXT
的文档表示WPARAM
的低位字的高位字节可以是以下值之一。这有两个问题:
你可以把它们结合起来,你必须这样才能起作用。MFC也这样做。我查过了。
你可能很想写
MAKEWPARAM(MAKEWORD(0, SBT_OWNERDRAW), 0)
。此将不起作用。根据外观,定义了SBT_
样式,这样,如果您只将它们与索引值进行OR运算,它们将自动出现在低位单词的高位字节中。
我必须查看MFC源代码才能弄清楚如何正确使用SB_SETTEXT
。
Edit控件没有所有者绘制模式,但是您可以将Edit控件子类化,并处理消息,如WM_ERASEBKGND
、WM_NCPAINT
、WM_PAINT
等,以及发送到编辑父窗口的WM_CTLCOLOREDIT
消息。
第2部分的答案,编辑中的垂直对齐文本:
RECT rect;
GetClientRect(GetDlgItem(hwnd, IDC_TIMEINPUT),&rect);
Rectangle(hdcEdit, rect.left, rect.top, rect.right, rect.bottom);
rect.left+=5; rect.top+=5; rect.right+=5; //rect.bottom+=5;
SendMessage(GetDlgItem(hwnd, IDC_TIMEINPUT), EM_SETRECTNP, 0, (LPARAM)&rect);
必须是多行的,你真的必须使用不同的数字来保持单行,并保持垂直对齐。EMS_SETRECTNP允许您指定文本的位置,从而使"编辑"具有更大的高度。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- wxWidgets 绘制实时图形的最佳控件
- MFC GUI 自定义控件:如何绘制光标更新以响应鼠标移动?
- 如何在我的子类控件paint方法中在默认的paint结果之上绘制一些东西
- 绘制滚动条到mfcactiveX控件Visual studio 2012(c++).
- STM_SETIMAGE不会使静态控件失效/重新绘制
- Tab 控件的 deal WM_PAINT 事件也需要手动绘制项目
- Win32 自定义绘制树视图控件
- C++Win32,可以编辑所有者绘制的控件
- 如何在改变文本时重新绘制静态控件
- 在图片控件中绘制图像
- 如何通知CTabCtrl中的所有控件,它们应该重新绘制(应该改变它们的大小)
- 要在窗口 gdi 中绘制的控件
- 如何在C++上绘制复杂的用户控件
- 无法绘制到 Win 7 上的 SysListView32 控件?