2012-01-01 13 views
5

mam ten program, gdzie stworzyłem okno i wewnątrz, że dodaje się kontrolę edycji przy użyciu zwykłego C (bez MFC lub dialogi), kod tworzenie edycja kontrola jestDlaczego moja kontrola edycji wygląda dziwnie w mojej aplikacji c32 win32 używają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); 

Ale renderowane kontrola wygląda brzydko. ..

enter image description here


A oto co chcę moje kontrole wyglądać ...

Cool vista themed edit control

Próbowałem wywoływać InitCommonControlsEx i zawierałem comctl32.lib, ale nic się nie zmieniło.
Myślę, że dodanie pliku manifestu aplikacji opisującego wszystkie zależności rozwiązałoby problem, ale nie wiem, jak to zrobić, używając Visual Studio 1010 IDE (nie mogę sam edytować pliku manifestu)

Czy to możliwe? aby uzyskać normalne sterowanie stylem vista za pomocą tylko c/C++ (bez MFC lub podobnego do .NET). Jeśli dodanie manifestu zasobów rozwiązałoby problem, to jak mogę zapisać/wygenerować jeden plik manifestu i dodać go do mojego 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; 
} 

UPDATE: I uaktualniony mój projekt używać unicode charset/biblioteki i teraz style wizualne pracują poza kontrolą edycji ... spojrzeć ..
enter image description here
użyłem style edit sterowania WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_NOHIDESEL

+0

Ok czytałem „Włączanie style wizualne” w witrynie MSDN i dodaje manifest następnie sprawdził, że w Resource Hacker ... każdy poszedł w porządku, ale nadal nie dostać oczekiwanego rezultatu. – smit

+0

To doprowadza mnie do szału ... jak on ** w tym świecie mogę włączyć style wizualne dla prostych kontrolek nie opartych na dialogu dialogowym ?????????????? – smit

+1

możliwy duplikat funkcji [Programowanie w C + Win API: jak uzyskać Windows 7 w poszukiwaniu kontrolek?] (Http://stackoverflow.com/questions/5663091/programming-in-c-win-api-how-to-get -windows-7-look-for-controls). Moja tam odpowiedź zapewnia prostszą metodę osadzania manifestu w twojej aplikacji, poprzez linker, aby zrobił to za ciebie. Nie jest wymagany edytor zasobów. –

Odpowiedz

4

To było dawno robiłem Win32 GUI rzeczy, ale jak pamiętam to należy użyć WS_EX_CLIENTEDGE a nie do zera, jak dłuższy stylu (co najmniej zatopiony efektu 3D, nie wiem co masz na myśli "Animowaną granicę").

+0

Próbowałem też, ale po prostu dostałem zatopioną krawędź, która wygląda jeszcze bardziej brzydko na żółtym tle, usuwając ten styl. Mam płaskie pole edycyjne z czarną obwódką .... relatywnie lepiej. – smit

+0

o tak, na żółtym tle będzie to wyglądało dość brzydko: -) Przyjąłem, że wybór tła miał podkreślić płaski wygląd. – Fredrik

+0

Przez animowaną ramkę mam na myśli efekt zawisu w Windows Vista + – smit

7
+0

Embedded manifest działał dla aplikacji opartych na oknach dialogowych, ale dla mojej prostej aplikacji win32 nie było żadnych zmian. – smit

+0

Myliłem się ... manifest działał poprawnie, ale nie wiem, co jest nie tak z konkretną kontrolą edycji, dzisiaj, kiedy próbowałem wyświetlać przycisk, wtedy wiedziałem, że problem nie dotyczy manifestacji, ale czegoś innego. – smit

Powiązane problemy