为啥我的编辑控件在没有使用 MFC 的 win32 c++ 应用程序中看起来很奇怪?
Posted
技术标签:
【中文标题】为啥我的编辑控件在没有使用 MFC 的 win32 c++ 应用程序中看起来很奇怪?【英文标题】:Why my edit control looks odd in my win32 c++ application using no MFC?为什么我的编辑控件在没有使用 MFC 的 win32 c++ 应用程序中看起来很奇怪? 【发布时间】:2012-01-31 11:37:31 【问题描述】:我有这个程序,我在其中创建了一个窗口,并在其中使用纯 C(没有 MFC 或对话框)添加了一个编辑控件,编辑控件创建代码如下
hWnd=::CreateWindowExA(NULL, //no extended style
"EDIT",
NULL, //no title
WS_CHILD|WS_VISIBLE|WS_BORDER,
x,
y,
Width,
Height,
hWndParent,
(HMENU)id,
(HINSTANCE) GetWindowLong(hWndParent, GWL_HINSTANCE),//the module instance
NULL);
但是渲染的控件看起来很难看...
这就是我希望我的控件看起来像...
我尝试拨打 InitCommonControlsEx
并加入 comctl32.lib
,但没有任何改变。
我认为添加描述所有依赖项的应用程序清单文件可以解决问题,但我不知道如何使用 Visual Studio 1010 IDE(我自己无法编辑清单文件)
是否有可能仅使用 c/c++(没有 MFC 或 .NET 之类的东西)获得正常的 vista 样式控件。如果添加清单资源可以解决问题,那么我如何编写/生成一个清单文件并将其添加到我的 exe 中?
#include<Windows.h>
#include <commctrl.h >
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib,"comctl32.lib")
HWND hwndEdit;
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp)
switch(uMsg)
case WM_CREATE:
hwndEdit = CreateWindow(
"EDIT", /* predefined class */
NULL, /* no window title */
WS_CHILD | WS_VISIBLE |
ES_LEFT | ES_AUTOHSCROLL|WS_BORDER,
0, 0, 100, 50, /* set size in WM_SIZE message */
hWnd, /* parent window */
(HMENU) 1, /* edit control ID */
(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
NULL); /* pointer not needed */
return 0;
break;
case WM_CLOSE:
::PostQuitMessage(0);//quit application
break;
default:
return ::DefWindowProcA(hWnd,uMsg,wp,lp);
return 0l;
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,char *cmd,int show)
INITCOMMONCONTROLSEX icc;
icc.dwICC=ICC_ANIMATE_CLASS|ICC_NATIVEFNTCTL_CLASS|ICC_STANDARD_CLASSES;
icc.dwSize=sizeof(icc);
InitCommonControlsEx(&icc);
char* tst="Simple edit control";
WNDCLASSEX mywindow;
MSG msg;
HWND hwnd;
mywindow.cbClsExtra=0;
mywindow.cbWndExtra=0;
mywindow.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
mywindow.hCursor=LoadCursor(NULL,IDC_CROSS);
mywindow.hIcon=LoadIcon(NULL,IDI_APPLICATION);
mywindow.hInstance=hinstance;
mywindow.lpfnWndProc=WndProc;
mywindow.lpszClassName="Test";
mywindow.lpszMenuName=NULL;
mywindow.style=0;
mywindow.cbSize=sizeof(WNDCLASSEX);
mywindow.hIconSm=NULL;
if(!RegisterClassEx(&mywindow))
MessageBox(NULL,"Window Registration failed","Error occured",NULL);
hwnd=CreateWindowEx(WS_EX_TOPMOST,"Test","My window",WS_OVERLAPPEDWINDOW,900,300,400,350,NULL,NULL,hinstance,tst);
if(hwnd==NULL)
MessageBox(NULL,"Window creation failed","error",NULL);
::ShowWindow(hwnd,SW_SHOW);
::UpdateWindow(hwnd);
while (1) //NOTE: Game engine type message loop
Sleep(1);
if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
if (msg.message == WM_QUIT)
break;
TranslateMessage( &msg );
DispatchMessage ( &msg );
return msg.wParam;
更新:我更新了我的项目以使用 unicode 字符集/库,现在视觉样式正在工作,除了编辑控件...看看..我使用了编辑控件 WS_CHILD 的样式|WS_VISIBLE|ES_AUTOHSCROLL|ES_NOHIDESEL
【问题讨论】:
好的,我在 msdn 站点中阅读了“启用视觉样式”并添加了清单,然后在资源黑客中检查...一切都很好,但仍然没有得到预期的结果。 这快把我逼疯了……我怎么能在这个世界上为简单的非对话框控件启用视觉样式??????????????? ?????? Programming In C + Win API: How To Get Windows 7 Look For Controls? 的可能副本。我的回答提供了一种更简单的方法,通过让链接器为您完成将清单嵌入到您的应用程序中。无需资源编辑器。 确保在创建编辑控制窗口之前调用InitCommonControlsEx
。
@Cody Gray 我现在添加了代码,请看一下并指出是否有问题。我正在使用完全相同的代码和 Visual Studio 2010 Ultimate。
【参考方案1】:
启用视觉样式:http://msdn.microsoft.com/en-us/library/bb773175.aspx
【讨论】:
嵌入清单适用于基于对话框的应用程序,但对于我简单的 win32 应用程序没有变化。 我错了......清单确实工作正常,但我不知道特定编辑控件有什么问题,今天当我尝试显示一个按钮时,我知道问题不在于表现形式但还有别的东西。【参考方案2】:我已经很久没有做 Win32 GUI 的东西了,但我记得你应该使用 WS_EX_CLIENTEDGE 而不是零作为扩展样式(至少是下沉的 3d 效果,不确定你对“动画边框”的意思)。
【讨论】:
我也试过了,但只是有一个凹陷的边缘,在黄色背景下看起来更难看,删除这种样式我得到一个带有黑色边框的平面编辑框......相对更好。 哦,是的,在黄色背景上,默认情况下它看起来很丑:-) 我认为背景的选择是为了突出平面外观。 动画边框是指windows vista+中的悬停效果 想通了,只是还没看到:-)以上是关于为啥我的编辑控件在没有使用 MFC 的 win32 c++ 应用程序中看起来很奇怪?的主要内容,如果未能解决你的问题,请参考以下文章