Почему мой контроль редактирования выглядит странно в моем приложении win32 c ++ без MFC? - PullRequest
5 голосов
/ 02 января 2012

У меня есть эта программа, в которой я создал окно, и внутри которого я добавил элемент управления для редактирования, используя обычный 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);

Но визуализированный элемент управления выглядит некрасиво ...

enter image description here


И вот что я хочу, чтобы мои элементы управления выглядели ...

Cool vista themed edit control

Я пытался позвонить InitCommonControlsEx и включил comctl32.lib, но ничего не изменилось.
Я думаю, что добавление файла манифеста приложения, описывающего все зависимости, решит проблему, но я не знаю, как это сделать с помощью IDE Visual Studio 1010 (я не могу редактировать файл манифеста самостоятельно)

Можно ли получить обычные элементы управления в стиле Vista, используя только c / c ++ (без MFC или чего-либо подобного .NET). Если добавление ресурса манифеста решит проблему, то как мне написать / сгенерировать один файл манифеста и добавить его в мой 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, и теперь визуальные стили работают за исключением элемента управления редактирования ... взгляните ..
enter image description here
Я использовал стили для управления редактированием. WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_NOHIDESEL

Ответы [ 2 ]

7 голосов
/ 02 января 2012

Включение визуальных стилей: http://msdn.microsoft.com/en-us/library/bb773175.aspx

4 голосов
/ 02 января 2012

Прошло много времени с тех пор, как я работал с Win32 GUI, но, насколько я помню, вы должны использовать WS_EX_CLIENTEDGE, а не ноль в качестве расширенного стиля (по крайней мере, затонувший эффект 3d, не уверен, что вы имеете в виду под "Анимированной рамкой")).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...