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

Đề tài: Cho mình hỏi là làm sao để tạo một panel và check các event riêng trong panel đó?? (Dùng windows.h) (:-)?

  1. #1
    Ngày gia nhập
    10 2018
    Bài viết
    6

    Smile Cho mình hỏi là làm sao để tạo một panel và check các event riêng trong panel đó?? (Dùng windows.h) (:-)?

    Như câu hỏi ở trên, bạn nào giúp mình được không ạ??
    Check event ví dụ là mouse enter, mouse down, mouse up, mouse leave.

    Cảm ơn các bạn rất nhiều.

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

    Nếu bạn dùng windows.h thì chắc có lẽ bạn đang lập trình Windows với API. Panel trong lập trình Windows mang tính cụ thể hóa nên cần phải biết nó là điều khiển riêng biệt hay là một phần của statusbar, một phần của toolbar, một phần của menubar,...v.v... Bạn nên minh họa cụ thể để các thành viên khác tham gia.

  3. #3
    Ngày gia nhập
    10 2018
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Nếu bạn dùng windows.h thì chắc có lẽ bạn đang lập trình Windows với API. Panel trong lập trình Windows mang tính cụ thể hóa nên cần phải biết nó là điều khiển riêng biệt hay là một phần của statusbar, một phần của toolbar, một phần của menubar,...v.v... Bạn nên minh họa cụ thể để các thành viên khác tham gia.
    Cảm ơn bạn.
    Ý của mình ở đây là tạo một cái bảng trống(trong C# là panel) và 1 function riêng để check các event trên cái bảng đó.
    Và cho hỏi thêm là làm sao để đổi màu cái bảng trống đó ạ??
    Một lần nữa xin cảm ơn bạn MHoang
    Đã được chỉnh sửa lần cuối bởi VnMine001 : 08-11-2018 lúc 06:22 AM.

  4. #4
    Ngày gia nhập
    03 2017
    Nơi ở
    Hà Nội
    Bài viết
    22

    Cho mình hỏi: có phải ý của bạn là bắt sự kiện click chuột trong c++

  5. #5
    Ngày gia nhập
    10 2018
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi vimotnguoi Xem bài viết
    Cho mình hỏi: có phải ý của bạn là bắt sự kiện click chuột trong c++
    Vâng. Nhưng chỉ bắt sự kiện trong 1 vùng thôi.

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

    Mặc định Cho mình hỏi là làm sao để tạo một panel và check các event riêng trong panel đó?? (Dùng windows.h) (:-)?

    Bạn cứ bám sát theo nguyên lý hoạt động truyền thông của Windows - thông tin qua lại sẽ được trao đổi bằng thông điệp sự kiện.
    Chương trình bên dưới có giao diện gồm 1 listbox, 2 panel; khi có sự kiện chuột đi vào, đi ra, nhấn, nhả, nhấp đôi trên 1 panel thì sự kiện đó được ghi nhận trên listbox; nếu muốn đổi màu 1 panel nào thì nhấn chuột phải lên panel đó.

    Visual C++ Code:
    1. #include<Windows.h>
    2.  
    3. // Định nghĩa một số thông điệp Notify mà Panel sẽ gởi tới cửa sổ cha
    4. enum
    5. {
    6.     PLN_ENTER = WM_USER + 1000,     // Chuột di chuyển vào trong
    7.     PLN_LEAVE,                      // Chuột di chuyển ra ngoài
    8.     PLN_LBUTTONDOWN,                // Chuột nhấn
    9.     PLN_LBUTTONUP,                  // Chuột nhả
    10.     PLN_LDBLCLKS,                   // Chuột nhấp đôi
    11.     PLN_RBUTTONDOWN                 // Chuột phải nhấn - hiển thị hộp thoại chọn màu cho panel
    12.     // ......
    13. };
    14.  
    15. // Định danh của các điều khiển
    16. #define IDC_LIST            1001
    17. #define IDC_LEFTPANEL       1002
    18. #define IDC_RIGHTPANEL      1003
    19.  
    20. class CMyPanel
    21. {
    22. private:
    23.     HWND        m_hPanel;       // Thẻ cửa sổ Panel
    24.     COLORREF    m_crBack;       // Màu nền
    25.     HBRUSH      m_hbrBack;      // Bút vẽ nền
    26.     BOOL        m_bFlag;        // Cờ sử dụng cho sự kiện chuột vào ra panel
    27.  
    28.     static LRESULT CALLBACK PanelProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    29.     {
    30.         if (message == WM_CREATE)
    31.         {
    32.             CMyPanel * pPanel = reinterpret_cast<CMyPanel*>((reinterpret_cast<LPCREATESTRUCT>(lparam))->lpCreateParams);
    33.             SetWindowLongPtr(hwnd, GWLP_USERDATA, PtrToUlong(pPanel));
    34.             return pPanel->OnCreate(hwnd);
    35.         }
    36.         CMyPanel * pPanel = reinterpret_cast<CMyPanel*>(static_cast<LONG_PTR>(GetWindowLongPtr(hwnd, GWLP_USERDATA)));
    37.         switch (message)
    38.         {
    39.         case WM_PAINT:          return pPanel->OnPaint();
    40.         case WM_MOUSEMOVE:      return pPanel->OnMouseMove();
    41.         case WM_MOUSEHOVER:     return pPanel->OnMouseHover(lparam);
    42.         case WM_MOUSELEAVE:     return pPanel->OnMouseLeave(lparam);
    43.         case WM_LBUTTONDOWN:    return pPanel->OnLButtonDown(lparam);
    44.         case WM_LBUTTONUP:      return pPanel->OnLButtonUp(lparam);
    45.         case WM_LBUTTONDBLCLK:  return pPanel->OnLButtonDblclk(lparam);
    46.         case WM_RBUTTONDOWN:    return pPanel->OnRButtonDown(lparam);
    47.         }
    48.         return DefWindowProc(hwnd, message, wparam, lparam);
    49.     }
    50.     LRESULT OnCreate(HWND hwnd)
    51.     {
    52.         m_hPanel = hwnd;
    53.         return 0;
    54.     }
    55.     LRESULT OnPaint()
    56.     {
    57.         PAINTSTRUCT     ps;
    58.         DRAWITEMSTRUCT  dis;
    59.  
    60.         UINT            id = GetDlgCtrlID(m_hPanel);
    61.  
    62.         ZeroMemory(&dis, sizeof(DRAWITEMSTRUCT));
    63.         dis.CtlID = id;
    64.         dis.hDC = BeginPaint(m_hPanel, &ps);
    65.         dis.hwndItem = m_hPanel;
    66.         GetClientRect(m_hPanel, &dis.rcItem);
    67.  
    68.         // Gởi thông điệp vẽ cho cửa sổ cha để cửa sổ cha vẽ thêm nếu muốn
    69.         SendMessage(GetParent(m_hPanel), WM_DRAWITEM, id, (LPARAM)&dis);
    70.  
    71.         EndPaint(m_hPanel, &ps);
    72.         return 0;
    73.     }
    74.     LRESULT OnMouseMove()
    75.     {
    76.         if (!m_bFlag)
    77.         {
    78.             TRACKMOUSEEVENT tme;
    79.             tme.cbSize = sizeof(TRACKMOUSEEVENT);
    80.             tme.dwFlags = TME_LEAVE | TME_HOVER;
    81.             tme.hwndTrack = m_hPanel;
    82.             tme.dwHoverTime = 10;
    83.             TrackMouseEvent(&tme);
    84.             m_bFlag = true;
    85.         }
    86.         return 0;
    87.     }
    88.     LRESULT OnMouseHover(LPARAM lparam)
    89.     {
    90.         if (m_bFlag)
    91.             SendMessage(GetParent(m_hPanel), PLN_ENTER, (WPARAM)m_hPanel, lparam);
    92.         return 0;
    93.     }
    94.     LRESULT OnMouseLeave(LPARAM lparam)
    95.     {
    96.         if (m_bFlag)
    97.         {
    98.             m_bFlag = FALSE;
    99.             SendMessage(GetParent(m_hPanel), PLN_LEAVE, (WPARAM)m_hPanel, lparam);
    100.         }
    101.         return 0;
    102.     }
    103.     LRESULT OnLButtonDown(LPARAM lparam)
    104.     {
    105.         SendMessage(GetParent(m_hPanel), PLN_LBUTTONDOWN, (WPARAM)m_hPanel, lparam);
    106.         return 0;
    107.     }
    108.     LRESULT OnLButtonUp(LPARAM lparam)
    109.     {
    110.         SendMessage(GetParent(m_hPanel), PLN_LBUTTONUP, (WPARAM)m_hPanel, lparam);
    111.         return 0;
    112.     }
    113.     LRESULT OnLButtonDblclk(LPARAM lparam)
    114.     {
    115.         SendMessage(GetParent(m_hPanel), PLN_LDBLCLKS, (WPARAM)m_hPanel, lparam);
    116.         return 0;
    117.     }
    118.     LRESULT OnRButtonDown(LPARAM lparam)
    119.     {
    120.         SendMessage(GetParent(m_hPanel), PLN_RBUTTONDOWN, (WPARAM)m_hPanel, lparam);
    121.         return 0;
    122.     }
    123.  
    124.     BOOL Register(HINSTANCE hInst, const PTCHAR lpfnWndProc)
    125.     {
    126.         static  BOOL    bRegisted = FALSE;  // Khai báo tĩnh để tránh đăng ký lớp nhiều lần
    127.         WNDCLASS        w;
    128.  
    129.         w.cbClsExtra = 0;
    130.         w.cbWndExtra = 0;
    131.         w.hbrBackground = m_hbrBack;
    132.         w.hCursor = LoadCursor(NULL, IDC_ARROW);
    133.         w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    134.         w.hInstance = hInst;
    135.         w.lpfnWndProc = PanelProc;
    136.         w.lpszClassName = lpfnWndProc;
    137.         w.lpszMenuName = NULL;
    138.         w.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    139.  
    140.         if (!bRegisted)
    141.         {
    142.             if (!RegisterClass(&w))
    143.                 return FALSE;
    144.             bRegisted = TRUE;
    145.         }
    146.         return TRUE;
    147.     }
    148.  
    149. public:
    150.     // Thuộc tính Hwnd - chỉ đọc
    151.     __declspec(property(get = getHwnd)) HWND Hwnd;
    152.     HWND getHwnd() { return m_hPanel; }
    153.     // Thuộc tính BackColor - đọc ghi
    154.     __declspec(property(get = getBackColor, put = setBackColor)) COLORREF BackColor;
    155.     COLORREF getBackColor() { return m_crBack; }
    156.     void setBackColor(COLORREF crNew)
    157.     {
    158.         DeleteObject(m_hbrBack);
    159.         m_crBack = crNew;
    160.         m_hbrBack = CreateSolidBrush(crNew);
    161.         SetClassLongPtr(m_hPanel, GCLP_HBRBACKGROUND, (LONG)m_hbrBack);
    162.         InvalidateRect(m_hPanel, NULL, TRUE);
    163.     }
    164.     // Tạo - hủy
    165.     CMyPanel() : m_hPanel(NULL)
    166.     {
    167.         m_crBack = RGB(192, 192, 192);
    168.         m_hbrBack = CreateSolidBrush(m_crBack);
    169.         m_bFlag = FALSE;
    170.     }
    171.     ~CMyPanel()
    172.     {
    173.         if (m_hPanel)
    174.             DestroyWindow(m_hPanel);
    175.     }
    176.     HWND Create(HINSTANCE hInst, HWND hParent, UINT id, int x, int y, int cx, int cy)
    177.     {
    178.         if (!Register(hInst, TEXT("PanelCtl")))
    179.             return FALSE;
    180.         return CreateWindow(TEXT("PanelCtl"), NULL, WS_CHILD | WS_VISIBLE, x, y, cx, cy, hParent, (HMENU)id, hInst, this);
    181.     }
    182.     void Move(int x, int y, int cx, int cy, BOOL bRedraw)
    183.     {
    184.         MoveWindow(m_hPanel, x, y, cx, cy, bRedraw);
    185.     }
    186. };
    187.  
    188. class CMyWindow
    189. {
    190. private:
    191.     HWND        m_hwnd;
    192.     HWND        m_hList;
    193.     CMyPanel *  m_pLeft;
    194.     CMyPanel *  m_pRight;
    195.  
    196.     static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    197.     {
    198.         if (message == WM_CREATE)
    199.         {
    200.             CMyWindow * pWindow = reinterpret_cast<CMyWindow*>((reinterpret_cast<LPCREATESTRUCT>(lparam))->lpCreateParams);
    201.             SetWindowLongPtr(hwnd, GWLP_USERDATA, PtrToUlong(pWindow));
    202.             return pWindow->OnCreate(hwnd);
    203.         }
    204.         CMyWindow * pWindow = reinterpret_cast<CMyWindow*>(static_cast<LONG_PTR>(GetWindowLongPtr(hwnd, GWLP_USERDATA)));
    205.         switch (message)
    206.         {
    207.         case WM_SIZE:           return pWindow->OnSize(lparam);
    208.         case WM_DESTROY:        return pWindow->OnDestroy();
    209.         case WM_DRAWITEM:       return pWindow->OnDrawItem((LPDRAWITEMSTRUCT)lparam);
    210.         // Các thông điệp từ Panel gởi tới
    211.         case PLN_ENTER:         return pWindow->Panel_MouseHover(wparam, lparam);
    212.         case PLN_LEAVE:         return pWindow->Panel_MouseLeave(wparam, lparam);
    213.         case PLN_LBUTTONDOWN:   return pWindow->Panel_LButtonDown(wparam, lparam);
    214.         case PLN_LBUTTONUP:     return pWindow->Panel_LButtonUp(wparam, lparam);
    215.         case PLN_LDBLCLKS:      return pWindow->Panel_LDblClk(wparam, lparam);
    216.         case PLN_RBUTTONDOWN:   return pWindow->Panel_RButtonDown(wparam, lparam);
    217.         }
    218.         return DefWindowProc(hwnd, message, wparam, lparam);
    219.     }
    220.     LRESULT OnCreate(HWND hwnd)
    221.     {
    222.         HINSTANCE   hInst = (HINSTANCE)GetWindowLong(hwnd, GWLP_HINSTANCE);
    223.         m_hwnd = hwnd;
    224.         m_hList = CreateWindow(TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT, 0, 0, 0, 0, hwnd, (HMENU)IDC_LIST, hInst, NULL);
    225.         m_pLeft = new CMyPanel();
    226.         if (!m_pLeft)
    227.             return -1;
    228.         if (!m_pLeft->Create(hInst, hwnd, IDC_LEFTPANEL, 0, 0, 0, 0))
    229.         {
    230.             delete m_pLeft;
    231.             m_pLeft = NULL;
    232.             return -1;
    233.         }
    234.         m_pRight = new CMyPanel();
    235.         if (!m_pRight)
    236.         {
    237.             delete m_pLeft;
    238.             m_pLeft = NULL;
    239.             return -1;
    240.         }
    241.         if (!m_pRight->Create(hInst, hwnd, IDC_RIGHTPANEL, 0, 0, 0, 0))
    242.         {
    243.             delete m_pLeft;
    244.             m_pLeft = NULL;
    245.             delete m_pRight;
    246.             m_pRight = NULL;
    247.             return -1;
    248.         }
    249.         return 0;
    250.     }
    251.     LRESULT OnSize(LPARAM lparam)
    252.     {
    253.         int     cxClient = LOWORD(lparam);
    254.         int     cyClient = HIWORD(lparam);
    255.         int     iPiece = (cxClient - 80) / 3;
    256.         MoveWindow(m_hList, 20, 20, iPiece, cyClient - 40, TRUE);
    257.         if (m_pLeft && m_pRight)
    258.         {
    259.             m_pLeft->Move(40 + iPiece, 20, iPiece, cyClient - 40, TRUE);
    260.             m_pRight->Move(60 + iPiece * 2, 20, iPiece, cyClient - 40, TRUE);
    261.         }
    262.         return 0;
    263.     }
    264.     LRESULT OnDestroy()
    265.     {
    266.         PostQuitMessage(0);
    267.         return 0;
    268.     }
    269.     LRESULT OnDrawItem(LPDRAWITEMSTRUCT pd)
    270.     {
    271.         PTCHAR  pszText = (pd->hwndItem == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right");
    272.         SetBkMode(pd->hDC, TRANSPARENT);
    273.         DrawText(pd->hDC, pszText, -1, &pd->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    274.         return 0;
    275.     }
    276.  
    277.     LRESULT Panel_MouseHover(WPARAM wparam, LPARAM lparam)
    278.     {
    279.         TCHAR   szText[MAX_PATH];
    280.         wsprintf(szText, TEXT("message PLN_ENTER from %sPanel"), ((HWND)wparam == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right"));
    281.         SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szText);
    282.         return 0;
    283.     }
    284.     LRESULT Panel_MouseLeave(WPARAM wparam, LPARAM lparam)
    285.     {
    286.         TCHAR   szText[MAX_PATH];
    287.         wsprintf(szText, TEXT("message PLN_LEAVE from %sPanel"), ((HWND)wparam == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right"));
    288.         SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szText);
    289.         return 0;
    290.     }
    291.     LRESULT Panel_LButtonDown(WPARAM wparam, LPARAM lparam)
    292.     {
    293.         TCHAR   szText[MAX_PATH];
    294.         wsprintf(szText, TEXT("message PLN_LBUTTONDOWN from %sPanel"), ((HWND)wparam == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right"));
    295.         SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szText);
    296.         return 0;
    297.     }
    298.     LRESULT Panel_LButtonUp(WPARAM wparam, LPARAM lparam)
    299.     {
    300.         TCHAR   szText[MAX_PATH];
    301.         wsprintf(szText, TEXT("message PLN_LBUTTONUP from %sPanel"), ((HWND)wparam == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right"));
    302.         SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szText);
    303.         return 0;
    304.     }
    305.     LRESULT Panel_LDblClk(WPARAM wparam, LPARAM lparam)
    306.     {
    307.         TCHAR   szText[MAX_PATH];
    308.         wsprintf(szText, TEXT("message PLN_LDBLCLKS from %sPanel"), ((HWND)wparam == m_pLeft->Hwnd) ? TEXT("Left") : TEXT("Right"));
    309.         SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szText);
    310.         return 0;
    311.     }
    312.     LRESULT Panel_RButtonDown(WPARAM wparam, LPARAM lparam)
    313.     {
    314.         CMyPanel *  pPanel = ((HWND)wparam == m_pLeft->Hwnd) ? m_pLeft : m_pRight;
    315.         COLORREF    crBack = pPanel->BackColor;
    316.         if (ChangeColor(m_hwnd, &crBack))
    317.             pPanel->BackColor = crBack;
    318.         return 0;
    319.     }
    320.  
    321.     BOOL ChangeColor(HWND hwnd, COLORREF * crColor)
    322.     {
    323.         CHOOSECOLOR     cc;
    324.         COLORREF        arColor[16];
    325.  
    326.         ZeroMemory(&cc, sizeof(cc));
    327.         cc.lStructSize = sizeof(cc);
    328.         cc.hwndOwner = hwnd;
    329.         cc.lpCustColors = (LPDWORD)arColor;
    330.         cc.Flags = CC_FULLOPEN | CC_RGBINIT;
    331.         cc.rgbResult = *crColor;
    332.         // Xuất hộp thoại chọn màu
    333.         if (ChooseColor(&cc))
    334.         {
    335.             if (*crColor != cc.rgbResult)
    336.             {
    337.                 *crColor = cc.rgbResult;
    338.                 return TRUE;
    339.             }
    340.         }
    341.         return FALSE;
    342.     }
    343.  
    344. public:
    345.     CMyWindow() : m_hwnd(NULL), m_hList(NULL), m_pLeft(NULL), m_pRight(NULL)
    346.     {
    347.     }
    348.     BOOL Create(HINSTANCE hInstance)
    349.     {
    350.         WNDCLASS    w;
    351.         w.cbClsExtra = 0;
    352.         w.cbWndExtra = 0;
    353.         w.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    354.         w.hCursor = LoadCursor(NULL, IDC_ARROW);
    355.         w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    356.         w.hInstance = hInstance;
    357.         w.lpfnWndProc = WndProc;
    358.         w.lpszClassName = TEXT("PanelDemo");
    359.         w.lpszMenuName = NULL;
    360.         w.style = CS_HREDRAW | CS_VREDRAW;
    361.         if (!RegisterClass(&w))
    362.             return FALSE;
    363.         HWND    hwnd = CreateWindow(w.lpszClassName, w.lpszClassName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, this);
    364.         if (!hwnd)
    365.             return FALSE;
    366.         ShowWindow(hwnd, SW_SHOW);
    367.         UpdateWindow(hwnd);
    368.         return TRUE;
    369.     }
    370.     int Loop()
    371.     {
    372.         MSG     msg;
    373.         while (GetMessage(&msg, NULL, 0, 0))
    374.         {
    375.             TranslateMessage(&msg);
    376.             DispatchMessage(&msg);
    377.         }
    378.         return msg.wParam;
    379.     }
    380. };
    381.  
    382. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, PSTR pCmd, int nShow)
    383. {
    384.     CMyWindow   MainWnd;
    385.     if (!MainWnd.Create(hInstance))
    386.         return 0;
    387.     return MainWnd.Loop();
    388. }

    Viết từ dự án trống trên VS2015
    Attached Files Attached Files

  7. #7
    Ngày gia nhập
    10 2018
    Bài viết
    6

    Cảm ơn nha bạn hiền.

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