2012-01-01 9 views
5

tengo este programa que le crea una ventana y en su interior que he añadido un control de edición utilizando C plano (sin MFC o diálogos), el código de creación de control de edición es tan¿Por qué mi control de edición parece extraño en mi aplicación win32 C++ sin 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); 

Pero el control prestados se ve feo. ..

enter image description here


Y esto es lo que quiero que mis controles para que parezca ...

Cool vista themed edit control

Intenté llamar al InitCommonControlsEx e incluí comctl32.lib, pero no cambió nada.
Creo que la adición de un archivo de manifiesto de aplicación que describe todas las dependencias que solucionar el problema, pero no sé cómo hacer que el uso de Visual Studio 1010 IDE (no puede editar un archivo de manifiesto a mí mismo)

¿Es posible obtener los controles de estilo de vista normales usando solo c/C++ (sin MFC ni nada parecido a .NET). Si agregar recurso manifiesto solucionaría el problema, ¿cómo puedo escribir/generar un archivo de manifiesto y agregarlo a mi 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; 
} 

ACTUALIZACIÓN: He actualizado mi proyecto para utilizar charset/bibliotecas Unicode y ahora estilos visuales están trabajando a excepción del control de edición ... echar un vistazo ..
enter image description here
que utilizan estilos de WS_CHILD control de edición | WS_VISIBLE | ES_AUTOHSCROLL | ES_NOHIDESEL

+0

Ok leí la "Habilitación de estilos visuales" en MSDN sitio y añaden el manifiesto después se comprueba que en todos los hackers de recursos ... fue bien, pero todavía no consiguió el resultado esperado. – smit

+0

Esto me está volviendo loco ... cómo es que él ** en este mundo puedo habilitar estilos visuales para controles simples que no están basados ​​en diálogos ??????????????????? – smit

+1

posible duplicado de [Programación en C + Win API: ¿Cómo obtener Windows 7 Buscar controles?] (Http://stackoverflow.com/questions/5663091/programming-in-c-win-api-how-to-get -windows-7-busque-por-controles). Mi respuesta allí proporciona un método más sencillo para insertar un manifiesto en su aplicación haciendo que el enlazador lo haga por usted. No se requiere un editor de recursos. –

Respuesta

4

fue un largo tiempo desde que estaba haciendo Win32 GUI cosas, pero como lo recuerdo que puedes usar WS_EX_CLIENTEDGE y no cero como un estilo extendido (por lo menos el efecto 3d hundido, sin saber qué te refieres con el "borde animado").

+0

Lo intenté también, pero acabo de obtener un borde hundido que se ve aún más feo con el fondo amarillo, eliminando este estilo obtuve una caja de edición plana con borde negro .... relativamente mejor. – smit

+0

oh sí, en un fondo amarillo se verá bastante feo por defecto: -) Supuse que la elección del fondo era resaltar el aspecto plano. – Fredrik

+0

Por borde animado me refiero al efecto de desplazamiento en Windows Vista + – smit

7

Habilitación de estilos visuales: http://msdn.microsoft.com/en-us/library/bb773175.aspx

+0

El manifiesto de inserción funcionó para aplicaciones basadas en diálogo, pero para mi aplicación win32 simple no hubo cambios. – smit

+0

Estaba equivocado ... manifest funcionaba correctamente, pero no sé qué pasa con el control de edición en particular, hoy, cuando intenté mostrar un botón, supe que el problema no radica en la manifestación, sino en otra cosa. – smit

Cuestiones relacionadas