Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Điểm vào của chương trình nên chọn kiểu nào?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    402

    Question Điểm vào của chương trình nên chọn kiểu nào?

    Mình thấy điểm vào chương trình lúc thì
    Code:
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
    lúc thì
    Code:
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
    cũng có lúc thì
    Code:
    int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hInstPrev, TCHAR* lpszCmdLine, int iCmdShow)
    , các cách trên khác nhau ở chỗ nào
    nếu mình muốn tạo 1 window class mới hiển thị chữ tiếnng Việt ở chính giữa thì làm thế nào

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Cái đầu tiên là mã chuẩn xác cho lập trình Windows, khi bạn muốn tự mình xây dựng chương trình.
    Cái thứ 2 và 3 là được tạo lập khi bạn dùng các Wizard kiểu dự án để tạo mã khung, nó thuận lợi cho IDE hơn là cho bạn.
    Trong cái thứ 2 thì bạn tìm trong các setting dự án chắc chắn đã có khai báo _UNICODE hay UNICODE - nó dùng cho chương trình sử dụng mã Unicode, tiếp ngữ w - wWinMain hay W - LPWSTR gợi nhớ tới Wide (rộng).

    Nên chọn kiểu nào thì cũng tùy sở thích của bạn mà thôi, còn riêng mình thì thích mã cơ bản vì vài lý do sau:
    _ Mã gọn gàng, sắp xếp bố cục ra sao tự mình quyết định. Cái 2 và 3 thì đưa vào rất nhiều thứ ta không dùng tới và rất cứng nhắc
    _ Tạo lớp rất dễ dàng trong khi 2 và 3 thiên về biến toàn cục.

    Tạo 1 window class mới hiển thị chữ tiếng Việt ở chính giữa thì làm thế nào ? Cả 3 mã trên đều có thể để bắt đầu cho nhu cầu này, hiển thị tiếng Việt ở chính giữa là tùy thuộc vào mã vẽ chữ của bạn, tuy nhiên có vài ý sau:
    _ Font chữ trên DC đang là Font Unicode
    _ Nếu trong dự án chưa có định danh UNICODE thì bạn : dùng chỉ thị tiền xử lý #if để định danh nó hoặc dùng cụ thể hàm vẽ chữ theo Unicode ví dụ như : DrawTextW thay cho DrawText.
    _ Chưa nghĩ ra hết các trường hợp nên nếu mã cụ thể về cái gì đó thì chúng ta có thể nói kỹ hơn

    Chào bạn.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    402

    Cảm ơn bạn, mình sẽ theo ý kiến chuyên gia trước, các kiểu còn lại tìm hiểu sau
    Mình có code sau, sao nó không hiện ra chữ Hello world nhỉ, code copy paste từ nhiều nguồn
    Custom.h
    C++ Code:
    1. #include <windows.h>
    2. #include <tchar.h>  
    3. #define CUSTOM_WC L"mctrl"
    4. static void
    5. CustomPaint(HWND hwnd);
    6. static LRESULT CALLBACK
    7. CustomProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    8. void
    9. CustomRegister(void);
    10. void
    11. CustomUnregister(void);
    Custom.cpp
    C++ Code:
    1. /* File custom.c
    2.  * (custom control implementation)
    3.  */
    4.  
    5. #include "Custom.h"
    6.  
    7.  
    8. static void
    9. CustomPaint(HWND hwnd)
    10. {
    11.     PAINTSTRUCT ps;
    12.     HDC hdc;
    13.     RECT rect;
    14.  
    15.     GetClientRect(hwnd, &rect);
    16.  
    17.     hdc = BeginPaint(hwnd, &ps);
    18.     SetTextColor(hdc, RGB(0,150,150));
    19.     SetBkColor(hdc, RGB(0,255,0));
    20.     //SetBkMode(hdc, TRANSPARENT);
    21.     DrawTextW(hdc, L"Hello World !", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    22.     EndPaint(hwnd, &ps);
    23. }
    24.  
    25.  
    26. static LRESULT CALLBACK
    27. CustomProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    28. {
    29.     switch(uMsg) {
    30.         case WM_PAINT:
    31.             CustomPaint(hwnd);
    32.             return 0;
    33.     }
    34.     return DefWindowProc(hwnd, uMsg, wParam, lParam);
    35. }
    36.  
    37. void
    38. CustomRegister(void)
    39. {
    40.     WNDCLASSEXW wc = { 0 };
    41.  
    42.     wc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
    43.     wc.lpfnWndProc = CustomProc;
    44.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    45.     wc.lpszClassName = CUSTOM_WC;
    46.     RegisterClassExW(&wc);
    47. }
    48.  
    49. void
    50. CustomUnregister(void)
    51. {
    52.     UnregisterClassW(CUSTOM_WC, NULL);
    53. }
    Source.cpp
    C++ Code:
    1. // GT_HelloWorldWin32.cpp  
    2. // compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c  
    3.  
    4. #include <windows.h>  
    5. #include <stdlib.h>  
    6. #include <string.h>  
    7. #include <tchar.h>  
    8. #include "Custom.h"
    9. // Global variables  
    10.  
    11. // The main window class name.  
    12. static TCHAR szWindowClass[] = _T("win32app");  
    13.  
    14. #define CUSTOM_ID     100
    15. #define MARGIN          7
    16. // The string that appears in the application's title bar.  
    17. static TCHAR szTitle[] = _T("Win32 Guided Tour Application");  
    18. static HWND hwndCustom;  
    19. HINSTANCE hInst;  
    20.  
    21. // Forward declarations of functions included in this code module:  
    22. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  
    23.  
    24. int CALLBACK WinMain(  
    25.     _In_ HINSTANCE hInstance,  
    26.     _In_ HINSTANCE hPrevInstance,  
    27.     _In_ LPSTR     lpCmdLine,  
    28.     _In_ int       nCmdShow  
    29. )  
    30. {
    31.     CustomRegister();
    32.     WNDCLASSEX wcex;  
    33.  
    34.     wcex.cbSize = sizeof(WNDCLASSEX);  
    35.     wcex.style          = CS_HREDRAW | CS_VREDRAW;  
    36.     wcex.lpfnWndProc    = WndProc;  
    37.     wcex.cbClsExtra     = 0;  
    38.     wcex.cbWndExtra     = 0;  
    39.     wcex.hInstance      = hInstance;  
    40.     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));  
    41.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);  
    42.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);  
    43.     wcex.lpszMenuName   = NULL;  
    44.     wcex.lpszClassName  = szWindowClass;  
    45.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));  
    46.  
    47.     if (!RegisterClassEx(&wcex))  
    48.     {  
    49.         MessageBox(NULL,  
    50.             _T("Call to RegisterClassEx failed!"),  
    51.             _T("Win32 Guided Tour"),  
    52.             NULL);  
    53.  
    54.         return 1;  
    55.     }  
    56.  
    57.     hInst = hInstance; // Store instance handle in our global variable  
    58.  
    59.     // The parameters to CreateWindow explained:  
    60.     // szWindowClass: the name of the application  
    61.     // szTitle: the text that appears in the title bar  
    62.     // WS_OVERLAPPEDWINDOW: the type of window to create  
    63.     // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)  
    64.     // 500, 100: initial size (width, length)  
    65.     // NULL: the parent of this window  
    66.     // NULL: this application does not have a menu bar  
    67.     // hInstance: the first parameter from WinMain  
    68.     // NULL: not used in this application  
    69.     HWND hWnd = CreateWindow(  
    70.         szWindowClass,  
    71.         szTitle,  
    72.         WS_OVERLAPPEDWINDOW,  
    73.         CW_USEDEFAULT, CW_USEDEFAULT,  
    74.         500, 100,  
    75.         NULL,  
    76.         NULL,  
    77.         hInstance,  
    78.         NULL  
    79.     );  
    80.  
    81.     if (!hWnd)  
    82.     {  
    83.         MessageBox(NULL,  
    84.             _T("Call to CreateWindow failed!"),  
    85.             _T("Win32 Guided Tour"),  
    86.             NULL);  
    87.  
    88.         return 1;  
    89.     }  
    90.  
    91.     // The parameters to ShowWindow explained:  
    92.     // hWnd: the value returned from CreateWindow  
    93.     // nCmdShow: the fourth parameter from WinMain  
    94.     ShowWindow(hWnd,  
    95.         nCmdShow);  
    96.     UpdateWindow(hWnd);  
    97.  
    98.     // Main message loop:  
    99.     MSG msg;  
    100.     while (GetMessage(&msg, NULL, 0, 0))  
    101.     {  
    102.         TranslateMessage(&msg);  
    103.         DispatchMessage(&msg);  
    104.     }  
    105.     CustomUnregister();
    106.     return (int) msg.wParam;  
    107. }  
    108.  
    109. //  
    110. //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)  
    111. //  
    112. //  PURPOSE:  Processes messages for the main window.  
    113. //  
    114. //  WM_PAINT    - Paint the main window  
    115. //  WM_DESTROY  - post a quit message and return  
    116. //  
    117. //  
    118. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
    119. {  
    120.     PAINTSTRUCT ps;  
    121.     HDC hdc;  
    122.     TCHAR greeting[] = _T("Hello, World!");  
    123.  
    124.     switch (message)  
    125.     {  
    126.     /*case WM_PAINT:  
    127.         hdc = BeginPaint(hWnd, &ps);  
    128.  
    129.         // Here your application is laid out.  
    130.         // For this introduction, we just print out "Hello, World!"  
    131.         // in the top left corner.  
    132.         TextOut(hdc,  
    133.             5, 5,  
    134.             greeting, _tcslen(greeting));  
    135.         // End application-specific layout section.  
    136.  
    137.         EndPaint(hWnd, &ps);  
    138.         break;  */
    139.     case WM_DESTROY:  
    140.         PostQuitMessage(0);  
    141.         break;  
    142.     case WM_SIZE:
    143.             if(wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED) {
    144.                 WORD cx = LOWORD(lParam);
    145.                 WORD cy = HIWORD(lParam);
    146.                 SetWindowPos(hwndCustom, NULL, MARGIN, MARGIN,
    147.                              cx-2*MARGIN, cy-2*MARGIN, SWP_NOZORDER);
    148.             }
    149.             break;
    150.  
    151.         case WM_CREATE:
    152.             hwndCustom = CreateWindowW(CUSTOM_WC, NULL, WS_CHILD | WS_VISIBLE,
    153.                                   0, 0, 0, 0, hWnd, (HMENU) CUSTOM_ID, hInst, NULL);
    154.             break;
    155.     default:  
    156.         return DefWindowProc(hWnd, message, wParam, lParam);  
    157.         break;  
    158.     }  
    159.     return 0;  
    160. }

    - - - Nội dung đã được cập nhật ngày 04-07-2017 lúc 09:12 PM - - -

    - - - Nội dung đã được cập nhật ngày 04-07-2017 lúc 09:57 PM - - -

    Mình làm được rồi, sửa tới sửa lui lẫn lộn W với Ex cả lên,
    loại bỏ toàn bộ W và EX trừ cái "WNDCLASSEX wcex;" là chạy được ,không hiểu răng luôn
    Đã được chỉnh sửa lần cuối bởi khoaph : 04-07-2017 lúc 10:04 PM.

  4. #4
    Ngày gia nhập
    06 2017
    Bài viết
    40

    Ex thường dùng cho unicode. 1 ký tự unicode nó đến 2 byte lận. Vd: a trong mã ansi 1 byte thôi nhưng a trong unicode 2 byte. Ex là mở rộng cho unicode sử dụng

  5. #5
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    402

    Phát hiện một trang quá hay về các hàm có chứa "W" và "A" luôn
    Working with Strings
    còn để bật tắt unicode thì vào Project>Project properties>Configuration properties thay đổi giá trị của Project defaults>Character set

    - - - Nội dung đã được cập nhật ngày 08-07-2017 lúc 08:53 PM - - -

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Cái đầu tiên là mã chuẩn xác cho lập trình Windows, khi bạn muốn tự mình xây dựng chương trình.
    Cái thứ 2 và 3 là được tạo lập khi bạn dùng các Wizard kiểu dự án để tạo mã khung, nó thuận lợi cho IDE hơn là cho bạn.
    Trong cái thứ 2 thì bạn tìm trong các setting dự án chắc chắn đã có khai báo _UNICODE hay UNICODE - nó dùng cho chương trình sử dụng mã Unicode, tiếp ngữ w - wWinMain hay W - LPWSTR gợi nhớ tới Wide (rộng).

    Nên chọn kiểu nào thì cũng tùy sở thích của bạn mà thôi, còn riêng mình thì thích mã cơ bản vì vài lý do sau:
    _ Mã gọn gàng, sắp xếp bố cục ra sao tự mình quyết định. Cái 2 và 3 thì đưa vào rất nhiều thứ ta không dùng tới và rất cứng nhắc
    _ Tạo lớp rất dễ dàng trong khi 2 và 3 thiên về biến toàn cục.

    Tạo 1 window class mới hiển thị chữ tiếng Việt ở chính giữa thì làm thế nào ? Cả 3 mã trên đều có thể để bắt đầu cho nhu cầu này, hiển thị tiếng Việt ở chính giữa là tùy thuộc vào mã vẽ chữ của bạn, tuy nhiên có vài ý sau:
    _ Font chữ trên DC đang là Font Unicode
    _ Nếu trong dự án chưa có định danh UNICODE thì bạn : dùng chỉ thị tiền xử lý #if để định danh nó hoặc dùng cụ thể hàm vẽ chữ theo Unicode ví dụ như : DrawTextW thay cho DrawText.
    _ Chưa nghĩ ra hết các trường hợp nên nếu mã cụ thể về cái gì đó thì chúng ta có thể nói kỹ hơn

    Chào bạn.
    Còn cái CALLBACK hay WINAPI hay APIENTRY thì sao bạn

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Mặc định Điểm vào của chương trình nên chọn kiểu nào?

    Tất cả 3 định danh trên đều được dẫn xuất từ từ khóa chỉ định của MS __stdcall nếu bạn đang dùng TBD của MS. Do vậy bạn có thể thay đổi chúng cho nhau.

    Đi sâu hơn nữa thì __stdcall chỉ định cho cách thức chuyển giao tham số thông qua ngăn xếp như thế nào. Có 2 kiểu chuyển giao : tham số vào sau nằm ở đỉnh stack và tham số vào trước nằm ở đỉnh stack. TBD sẽ biết cách chuyển đổi vào mã nhận tham số ví dụ như nhận tham số thông qua [BP+x].

    Muốn biết rõ hơn thì bạn tìm hiểu về hợp ngữ, khác nhau giữa chuyển giao tham số từ C với Pascal, giữa các dòng máy MAC và dòng máy IBM-Intel.

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn