2012-01-01 14 views
5

tôi có chương trình này mà tôi đã tạo ra một cửa sổ và bên trong mà tôi thêm một điều khiển chỉnh sửa sử dụng đồng bằng C (không MFC hoặc hộp thoại), mã tạo chỉnh sửa điều khiển là nhưTại sao điều khiển chỉnh sửa của tôi trông lạ trong ứng dụng win32 C++ của tôi bằng cách sử dụng MFC không?

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); 

Nhưng sự kiểm soát render trông xấu xí. ..

enter image description here


Và đây là những gì tôi muốn điều khiển của tôi trông giống như ...

Cool vista themed edit control

Tôi đã thử gọi số InitCommonControlsEx và bao gồm comctl32.lib nhưng không có gì thay đổi.
Tôi nghĩ rằng việc thêm tệp kê khai ứng dụng mô tả tất cả các phụ thuộc sẽ khắc phục sự cố nhưng tôi không biết cách thực hiện điều đó bằng cách sử dụng Visual Studio 1010 IDE (Tôi không thể chỉnh sửa tệp kê khai)

Có thể để có được các điều khiển kiểu vista bình thường chỉ sử dụng c/C++ (không có MFC hoặc bất kỳ thứ gì như .NET). Nếu việc thêm tài nguyên tệp kê khai sẽ khắc phục sự cố thì làm cách nào tôi có thể viết/tạo một tệp kê khai và thêm nó vào exe của tôi?

#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: Tôi cập nhật dự án của tôi để sử dụng unicode charset/thư viện và bây giờ phong cách trực quan đang làm việc trừ những chỉnh sửa điều khiển ... hãy xem ..
enter image description here
tôi đã sử dụng phong cách cho chỉnh sửa kiểm soát WS_CHILD WS_VISIBLE | ES_AUTOHSCROLL | ES_NOHIDESEL

+0

Ok tôi đọc "Bật Styles Visual" trong trang web MSDN và thêm các biểu hiện sau đó kiểm tra rằng trong các hacker tài nguyên ... mỗi diễn ra tốt đẹp nhưng vẫn không có được kết quả mong đợi. – smit

+0

Điều này khiến tôi phát điên ... làm thế nào anh ta ** trong thế giới này tôi có thể kích hoạt kiểu trực quan cho các điều khiển dựa trên hộp thoại không đơn giản ???????????????????? – smit

+1

có thể trùng lặp của [Lập trình trong C + Win API: Làm thế nào để có được Windows 7 Look For Controls?] (Http://stackoverflow.com/questions/5663091/programming-in-c-win-api-how-to-get -windows-7-look-for-controls). Câu trả lời của tôi có cung cấp một phương thức đơn giản hơn để nhúng một tệp kê khai vào ứng dụng của bạn bằng cách làm cho trình liên kết làm điều đó cho bạn. Không yêu cầu trình chỉnh sửa tài nguyên. –

Trả lời

4

Đã lâu rồi kể từ khi tôi làm công cụ Win32 GUI nhưng tôi nhớ bạn nên sử dụng WS_EX_CLIENTEDGE và không phải là kiểu mở rộng (ít nhất là hiệu ứng 3D chìm, không chắc chắn bạn có nghĩa là với "Biên giới hoạt hình").

+0

Tôi đã thử rằng quá nhưng chỉ có một cạnh chìm trông xấu hơn nữa với nền màu vàng, loại bỏ phong cách này tôi có một hộp chỉnh sửa phẳng với biên giới màu đen .... tương đối tốt hơn. – smit

+0

oh có, trên nền màu vàng, nó sẽ trông khá xấu xí theo mặc định: -) Tôi cho rằng lựa chọn nền là để làm nổi bật giao diện phẳng. – Fredrik

+0

Bởi biên giới hoạt hình tôi có nghĩa là hiệu ứng di chuột trong cửa sổ vista + – smit

7
+0

Embeding manifest làm việc cho các ứng dụng dựa trên hộp thoại nhưng đối với ứng dụng win32 đơn giản của tôi không thay đổi. – smit

+0

Tôi đã sai ... biểu hiện đã hoạt động chính xác, nhưng tôi không biết điều gì đã xảy ra với điều khiển chỉnh sửa cụ thể, hôm nay khi tôi thử hiển thị nút thì tôi biết rằng vấn đề không có biểu hiện nhưng khác. – smit

Các vấn đề liên quan