2013-07-31 75 views
3

我想让我的对话框匹配。我一直通过谷歌,随机测试等,甚至读了一些它不能做的地方。C++ Win32,可以编辑控件是否是所有者绘制的?

我所能做的就是使用其中一条消息来设置字体和颜色,但无处绘制自己。

我认为它必须能够做...

有没有人有任何想法?或者对此有所了解?

http://imageshack.com/a/img832/5955/91m.png

+0

您的控件是否有'WS_EX_CLIENTEDGE'风格应用于它?另外,你是用Visual Studio资源编辑器还是手工创建它? – Joel

+0

我正在手动执行资源文件,并在按钮上使用了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。 感谢您的回复。 –

+1

它看起来像资源脚本中的编辑控件默认设置了一些样式。如果我在Visual Studio中创建一个对话框并关闭边框,代码是'EDITTEXT IDC_EDIT1,17,51,136,14,ES_AUTOHSCROLL |不是WS_BORDER',而是在边框设置为打开时包含“WS_BORDER”。 – Joel

回答

2

它看起来像编辑控件不支持业主平局,但你仍然可以解决您的直接问题。根据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_SETTEXTWPARAM的低位字的高字节可以是下面的值之一。这有两个问题:

  1. 你可以合并它们,你必须这样工作。 MFC也完成它。我检查了。你可能会写MAKEWPARAM(MAKEWORD(0, SBT_OWNERDRAW), 0)。这不会工作。通过外观,SBT_样式被定义,以便它们将自动出现在低位字的高位字节中,如果您只是将它们与您的索引值进行或运算。

,我不得不看MFC的源代码,以弄清楚如何使用SB_SETTEXT正确地告诉。

+0

谢谢!这在状态栏中看到了我想要的状态方面取得了一些进展。仍在使用它。 回到编辑,我发现它尽可能垂直对齐文本。我搜索了一切,最接近的东西是TextAlign(),它会将对齐方式更改为固定位置,而不是垂直居中。我已经花了几个小时的时间,所有的事情都是通过WM_CTLCOLOREDIT完成的,没有任何进展。对此有何想法? –

+0

你可能会使用'EM_SETRECT'和'EM_SETLIMITTEXT'的组合,但是由于'EM_SETRECT'显然只适用于多行编辑控件,这对我来说看起来很不方便(尽管它是API的一部分)。我没有真的尝试过,所以我不能保证它会起作用。 – Joel

1

编辑控件不具有所有者绘制模式,但是你也可以继承的编辑控制和像WM_ERASEBKGNDWM_NCPAINTWM_PAINT等,还有WM_CTLCOLOREDIT发送给编辑的父窗口消息处理的消息。

+1

这也不起作用,编辑控件部分重绘而不使用WM_PAINT。非常非常淘气,但必须在386SUX机器上运行时才需要进行修复。 –

0

的第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允许您指定文本的位置,允许编辑具有更高的高度。

相关问题