2012-01-01 17 views
5

Ho questo programma in cui ho creato una finestra e dentro che ho aggiunto un controllo di modifica utilizzando la lingua C (senza MFC o le finestre di dialogo), il codice di creazione controllo di modifica è comePerché il mio controllo di modifica sembra strano nella mia applicazione C++ win32 che non usa 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); 

ma il controllo reso sembra brutto. ..

enter image description here


Ed ecco quello che voglio i miei controlli a guardare come ...

Cool vista themed edit control

Ho provato a chiamare InitCommonControlsEx e incluso comctl32.lib ma non è cambiato nulla.
Credo che l'aggiunta di un file manifesto dell'applicazione che descrive tutte le dipendenze avrebbe risolto il problema, ma non so come fare utilizzando Visual Studio 1010 IDE (non riesco a modificare un file manifesto sottoscritto)

E 'possibile per ottenere i normali controlli di stile vista usando solo c/C++ (senza MFC o qualcosa di simile a .NET). Se aggiungere risorse manifest risolverà il problema, allora come posso scrivere/generare un file manifest e aggiungerlo al mio 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: ho aggiornato il mio progetto per utilizzare unicode charset/biblioteche e ora stili visivi stanno lavorando tranne che per il controllo di modifica ... date un'occhiata ..
enter image description here
ho usato stili per WS_CHILD controllo di modifica | WS_VISIBLE | ES_AUTOHSCROLL | ES_NOHIDESEL

+0

Ok ho letto la "Abilitazione Stili di visualizzazione" in sito MSDN e ha aggiunto il manifesto poi verificato che nel Resource Hacker ... ogni andato bene, ma ancora non ha ottenuto il risultato atteso. – smit

+0

Questo mi sta facendo impazzire ... come lui ** in questo mondo posso abilitare gli stili visivi per semplici controlli non basati su finestre di dialogo ??????????????????? – smit

+1

possibile duplicato di [Programmazione in C + Win API: Come ottenere Windows 7 Cerca i controlli?] (Http://stackoverflow.com/questions/5663091/programming-in-c-win-api-how-to-get -Windows-7-look-per-controlli). La mia risposta fornisce un metodo più semplice per incorporare un manifest nella tua applicazione facendo in modo che il linker lo faccia per te. Non è richiesto alcun editor di risorse. –

risposta

4

era da molto tempo che stavo facendo Win32 GUI roba, ma mi ricordo che si dovrebbe usare WS_EX_CLIENTEDGE e non zero come uno stile esteso (almeno l'effetto 3D affondata, non so cosa intendi con il "Bordo animato").

+0

Ho provato anche quello, ma ho appena ottenuto un bordo infossato che sembra ancora più brutto con lo sfondo giallo, rimuovendo questo stile ho ottenuto una casella di modifica piatta con bordo nero .... relativamente migliore. – smit

+0

oh sì, su uno sfondo giallo sarà piuttosto brutto di default: -) Ho pensato che la scelta dello sfondo fosse quella di evidenziare l'aspetto piatto. – Fredrik

+0

Per bordo animato intendo l'effetto hover in windows vista + – smit

7
+0

Embed manifest ha funzionato per applicazioni basate su finestre di dialogo, ma per la mia semplice applicazione win32 nessuna modifica. – smit

+0

Mi sbagliavo ... manifest ha funzionato correttamente, ma non so cosa c'è di sbagliato con il particolare controllo di modifica, oggi, mentre provavo a visualizzare un pulsante, sapevo che il problema non era la manifestazione ma altro. – smit