我想让我的对话框匹配。我一直通过谷歌,随机测试等,甚至读了一些它不能做的地方。C++ Win32,可以编辑控件是否是所有者绘制的?
我所能做的就是使用其中一条消息来设置字体和颜色,但无处绘制自己。
我认为它必须能够做...
有没有人有任何想法?或者对此有所了解?
http://imageshack.com/a/img832/5955/91m.png
我想让我的对话框匹配。我一直通过谷歌,随机测试等,甚至读了一些它不能做的地方。C++ Win32,可以编辑控件是否是所有者绘制的?
我所能做的就是使用其中一条消息来设置字体和颜色,但无处绘制自己。
我认为它必须能够做...
有没有人有任何想法?或者对此有所了解?
http://imageshack.com/a/img832/5955/91m.png
它看起来像编辑控件不支持业主平局,但你仍然可以解决您的直接问题。根据the MSDN page for EDITTEXT,默认情况下,资源文件中的编辑控件具有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_
样式被定义,以便它们将自动出现在低位字的高位字节中,如果您只是将它们与您的索引值进行或运算。
,我不得不看MFC的源代码,以弄清楚如何使用SB_SETTEXT
正确地告诉。
谢谢!这在状态栏中看到了我想要的状态方面取得了一些进展。仍在使用它。 回到编辑,我发现它尽可能垂直对齐文本。我搜索了一切,最接近的东西是TextAlign(),它会将对齐方式更改为固定位置,而不是垂直居中。我已经花了几个小时的时间,所有的事情都是通过WM_CTLCOLOREDIT完成的,没有任何进展。对此有何想法? –
你可能会使用'EM_SETRECT'和'EM_SETLIMITTEXT'的组合,但是由于'EM_SETRECT'显然只适用于多行编辑控件,这对我来说看起来很不方便(尽管它是API的一部分)。我没有真的尝试过,所以我不能保证它会起作用。 – Joel
编辑控件不具有所有者绘制模式,但是你也可以继承的编辑控制和像WM_ERASEBKGND
,WM_NCPAINT
,WM_PAINT
等,还有WM_CTLCOLOREDIT
发送给编辑的父窗口消息处理的消息。
这也不起作用,编辑控件部分重绘而不使用WM_PAINT。非常非常淘气,但必须在386SUX机器上运行时才需要进行修复。 –
的第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允许您指定文本的位置,允许编辑具有更高的高度。
您的控件是否有'WS_EX_CLIENTEDGE'风格应用于它?另外,你是用Visual Studio资源编辑器还是手工创建它? – Joel
我正在手动执行资源文件,并在按钮上使用了BS_OWNERDRAW,甚至绘制了向上/向下状态。我正在使用wxDev-CPP。 EDITTEXT IDC_TIMEINPUT,5,135,160,12,ES_CENTER // | EMS_OWNERDRAW 控制“状态”,IDC_STATUSBAR,STATUSCLASSNAME,0,0,0,SBT_OWNERDRAW 行是否与资源文件中的行一样。我试图自定义绘制状态栏,但它与“凸起的边缘”一样的问题。 另外,我没有在任何地方指定WS_EX_CLIENTEDGE。 感谢您的回复。 –
它看起来像资源脚本中的编辑控件默认设置了一些样式。如果我在Visual Studio中创建一个对话框并关闭边框,代码是'EDITTEXT IDC_EDIT1,17,51,136,14,ES_AUTOHSCROLL |不是WS_BORDER',而是在边框设置为打开时包含“WS_BORDER”。 – Joel