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

Đề tài: Mảng vào hàm WndProc không tồn tại đc?

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

    Mặc định Mảng vào hàm WndProc không tồn tại đc?

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		1.jpg
Lần xem:	2
Size:		97.7 KB
ID:		55814Click vào hình ảnh để lấy hình ảnh lớn

Tên:		2.jpg
Lần xem:	1
Size:		136.3 KB
ID:		55815
    Ở hình 1: Mảng tồn tại. Nhưng ở hình 2: mảng không còn khi vào hàm WndProc vậy?

    Visual C++ Code:
    1. /************khai báo lớp**********************/
    2. #include "stdafx.h"
    3. #include "Chuong Trinh Class Mau.h"
    4.  
    5. typedef void (*pADDCONTROLFORM)();
    6. typedef void (*pControlClick)();
    7.  
    8. class FormMain
    9. {  
    10. private:
    11.     int nCmdShow;
    12.     COLORREF BkColor;
    13.     int IdControls[2]; 
    14.     void (*pAddControlForm)();
    15.     void (*pAddControlClick[2])();
    16.  
    17. protected: 
    18.     static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 
    19.     void ErrorExit(LPTSTR);
    20.     LRESULT OnCommand(HWND, UINT, WPARAM, LPARAM);
    21.  
    22. public:
    23.     HINSTANCE hInst;
    24.     HWND hWnd; 
    25.  
    26.     void RegisterAddControlForm(pADDCONTROLFORM);
    27.     bool RegisterControlClick(pADDCONTROLFORM, int);
    28.     FormMain(void);
    29.     ~FormMain(void);
    30.     bool LoadForm(HINSTANCE, PWCHAR, PWCHAR, int, int, int, int, int);
    31.     int Show();
    32.     void CloseFormMain();
    33. };
    34. /************Các Function trong lớp**********************/
    35.  
    36. FormMain::FormMain(void)
    37. {
    38.     hInst = 0;
    39.     hWnd = 0;
    40.     BkColor = RGB(240, 240, 240);
    41.     pAddControlForm = NULL;
    42.     FillMemory(IdControls, 100, -1);
    43.     FillMemory(pAddControlClick, 100, NULL);
    44. }
    45.  
    46. void FormMain::CloseFormMain()
    47. {
    48.     DestroyWindow(hWnd);
    49. }
    50.  
    51. void FormMain::RegisterAddControlForm(pADDCONTROLFORM f)
    52. {
    53.     pAddControlForm = f;
    54. }
    55.  
    56. bool FormMain::LoadForm(HINSTANCE hInstance, PWCHAR szTilte, PWCHAR szClassName, int Left, int Right, int Width, int Height, int FnCmdShow)
    57. {
    58.     hInst = hInstance;
    59.     nCmdShow = FnCmdShow;
    60.     RECT RectScreen;
    61.     GetWindowRect( GetDesktopWindow(), &RectScreen);
    62.  
    63.     if (Left == -1) Left = (RectScreen.right - Width)/2;
    64.     if (Right == -1) Right = (RectScreen.bottom - Height)/2;
    65.  
    66.     WNDCLASSEX wcex;
    67.  
    68.     wcex.cbSize = sizeof(WNDCLASSEX);
    69.     wcex.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    70.     wcex.lpfnWndProc    = (WNDPROC) StaticWndProc;
    71.     wcex.cbClsExtra     = 0;
    72.     wcex.cbWndExtra     = 0;
    73.     wcex.hInstance      = hInst;
    74.     wcex.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    75.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    76.     wcex.hbrBackground  = (HBRUSH) CreateSolidBrush(BkColor);
    77.     wcex.lpszMenuName   = NULL;
    78.     wcex.lpszClassName  = szClassName;
    79.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(108));
    80.     if (!RegisterClassEx(&wcex))
    81.     {
    82.         ErrorExit(L"RegisterClass");
    83.         return FALSE;
    84.     }
    85.        
    86.     hWnd = CreateWindow(szClassName, szTilte, WS_OVERLAPPEDWINDOW, Left, Right, Width, Height, NULL, NULL, hInst, NULL);
    87.     if (!hWnd)
    88.     {
    89.         ErrorExit(L"CreateWindow");
    90.         return FALSE;
    91.     }
    92.     return true;
    93. }
    94.  
    95. int FormMain::Show()
    96. {
    97.     if (!hWnd || !hInst)
    98.     {
    99.         MessageBox(NULL, L"Error!", L"Error: 'hInst = NULL' Or 'hWnd = NULL'", MB_OK);
    100.         return 0;
    101.     }
    102.    
    103.     if (pAddControlForm) (*pAddControlForm)(); 
    104.  
    105.     ShowWindow(hWnd, nCmdShow);
    106.     UpdateWindow(hWnd);
    107.  
    108.     MSG msg;
    109.     while (GetMessage(&msg, NULL, 0, 0))
    110.     {
    111.         //if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    112.         {
    113.             TranslateMessage(&msg);
    114.             DispatchMessage(&msg);
    115.         }
    116.     }
    117.     return (int) msg.wParam;
    118. }
    119.  
    120. bool FormMain::RegisterControlClick(pADDCONTROLFORM f, int IdControl)
    121. {
    122.     for (int i = 0 ; i < 100 ; i++)
    123.         if (IdControls[i] == -1)
    124.         {
    125.             IdControls[i] = IdControl;
    126.             pAddControlClick[i] = f;
    127.             return true;
    128.         }
    129.     return false;
    130. }
    131.  
    132. FormMain::~FormMain(void)
    133. {
    134.  
    135. }
    136.  
    137. LRESULT CALLBACK FormMain::StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    138. {
    139.     if (uMsg == WM_CREATE)
    140.     {
    141.         LPCREATESTRUCT  pcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
    142.         FormMain * pWindow = reinterpret_cast<FormMain*>(pcs->lpCreateParams);
    143.         SetWindowLong(hWnd, GWLP_USERDATA, PtrToUlong(pWindow));
    144.         return 0;
    145.     }
    146.     FormMain * pWindow = reinterpret_cast<FormMain*>(static_cast<LONG_PTR>(GetWindowLongPtr(hWnd, GWLP_USERDATA)));
    147.        
    148.     PAINTSTRUCT ps;
    149.     HDC hdc;
    150.  
    151.     switch(uMsg)
    152.     {  
    153.         case WM_COMMAND:
    154.             return pWindow->OnCommand(hWnd, uMsg, wParam, lParam);
    155.  
    156.         case WM_PAINT:
    157.             hdc = BeginPaint(hWnd, &ps);
    158.             EndPaint(hWnd, &ps);
    159.             break;
    160.  
    161.         case WM_DESTROY:
    162.             PostQuitMessage(0);
    163.             break;
    164.  
    165.         default:
    166.             return DefWindowProc(hWnd,uMsg,wParam,lParam);
    167.     }
    168.     return 0;
    169. }
    170.  
    171. void FormMain::ErrorExit(LPTSTR lpszFunction)
    172. {
    173.     LPVOID lpMsgBuf;
    174.     LPVOID lpDisplayBuf;
    175.     DWORD dw = GetLastError();
    176.  
    177.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw,
    178.                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
    179.  
    180.     lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
    181.     swprintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf);
    182.     MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
    183.  
    184.     LocalFree(lpMsgBuf);
    185.     LocalFree(lpDisplayBuf);
    186. }
    187.  
    188. LRESULT FormMain::OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    189. {
    190.     int Lo_wPram = LOWORD(wParam), Hi_wPram = HIWORD(wParam);
    191.  
    192.     for (int i = 0 ; i < 100 ; i++)
    193.     {
    194.         if (Lo_wPram == IdControls[i] && pAddControlClick[i])
    195.         {
    196.             (*pAddControlClick[i])();
    197.             return 0;
    198.         }
    199.     }
    200.     return DefWindowProc(hWnd, uMsg, wParam, lParam);
    201. }
    202. /************Các Function Chính**********************/
    203. void ButtonExitClick()
    204. {
    205.     fm->CloseFormMain();
    206. }
    207.  
    208. void CreateControl()
    209. {
    210.     int y = 10;
    211.     hBtnExit = CreateWindow(TEXT("button"), TEXT("Exit"), WS_VISIBLE | WS_CHILD , 10, y, 100, 25, fm->hWnd, (HMENU) 100, fm->hInst, NULL);
    212.     fm->RegisterControlClick(&ButtonExitClick, 100);
    213. }
    214.  
    215. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    216. {
    217.     UNREFERENCED_PARAMETER(hPrevInstance);
    218.     UNREFERENCED_PARAMETER(lpCmdLine); 
    219.  
    220.     RECT RectScreen;
    221.     GetWindowRect( GetDesktopWindow(), &RectScreen);
    222.     RectScreen.bottom = RectScreen.bottom - 40;
    223.     if (!fm->LoadForm(hInstance, L"Chuong Trinh Mau Class",L"ChuongTrinhMauClass", RectScreen.left , RectScreen.top, RectScreen.right, RectScreen.bottom, nCmdShow))
    224.         return 0;
    225.     fm->RegisterAddControlForm(&CreateControl);
    226.     int res = fm->Show();
    227.     delete fm;
    228.     return res;
    229. }
    Đã được chỉnh sửa lần cuối bởi MHoang : 13-07-2017 lúc 10:44 AM. Lý do: Chỉnh lại khung mã trên VC++

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

    Tại dòng 86, bạn thử thay đổi như sau :
    Visual C++ Code:
    1.     // hWnd = CreateWindow(szClassName, szTilte, WS_OVERLAPPEDWINDOW, Left, Right, Width, Height, NULL, NULL, hInst, NULL);
    2.     hWnd = CreateWindow(szClassName, szTilte, WS_OVERLAPPEDWINDOW, Left, Right, Width, Height, NULL, NULL, hInst, this);
    Nếu chưa giải quyết được, bạn có thể đưa dự án lên mình sẽ giúp tìm lỗi.
    Yêu mã hơn yêu em !!!

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

    THANK bạn. Mình giải quyết đc rồi. Quên khởi động biến tĩnh.

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