2011-11-18 16 views
5

Không có tài nguyên, tôi có thể tạo giao diện người dùng của mình với một mảng phức tạp gồm CreateWindow()CreateWindowEx()WndProc() để xử lý sự kiện của mình.Làm cách nào để sử dụng tài nguyên Dialog trong Win32?

Tôi nhận thấy nếu tôi nhấp chuột phải vào chế độ xem tài nguyên và nhấp vào "thêm tài nguyên", tôi có thể vẽ một hộp thoại với tất cả các điều khiển. Điều này sẽ tiết kiệm cho tôi một số lượng lớn thời gian nếu tôi có thể vẽ giao diện như tôi thường làm với C#.

Sau khi tôi đã vẽ giao diện với trình chỉnh sửa tài nguyên, làm cách nào để tạo cửa sổ từ mã? Ai đó có thể cung cấp một ví dụ rất đơn giản với một nút và hiển thị cách xử lý sự kiện WM_COMMAND trên nút đó không?

Ngoài ra, đây có phải là cách mọi người tạo GUI không? Có mất mát linh hoạt để thực hiện theo cách này không? Ngay cả trong C# tôi thường phải bổ sung giao diện người dùng do nhà thiết kế tạo ra với giao diện người dùng tạo mã của riêng tôi, nhưng phần lớn thời gian tôi khá vui khi sử dụng nhà thiết kế.

Trả lời

5

Sau khi tạo hộp thoại trong trình soạn thảo tài nguyên, gọi CreateDialog (thoại modeless; bạn cần phải gửi các thông điệp bằng tay giống như khi bạn sử dụng CreateWindow) hoặc DialogBox (hộp thoại modal; chức năng không trả lại cho đến khi bạn đóng hộp thoại. nó sẽ gửi đi cho bạn) để hiển thị hộp thoại. Cũng giống như bạn vượt qua trong cửa sổ proc để RegisterClass, bạn vượt qua hộp thoại proc để các chức năng cho các cuộc gọi thoại trở lại. Ví dụ về DialogProc trông giống như sau:

BOOL DialogProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam){ 
    switch(iMessage){ 
    case WM_COMMAND: 
     switch(LOWORD(wParam)){ 
     case BTOK: 
      MessageBox(hDlg, "Hello, World!", NULL, NULL); 
      return TRUE; 
      break; 
     } 
     break; 
    } 
    return FALSE; 
} 

Đây là cách cơ bản để tạo hộp thoại. Phương pháp phức tạp hơn thường sẽ liên quan đến OOP, thường gói mỗi tài nguyên (nút, cửa sổ, vv) làm đối tượng C++ hoặc sử dụng MFC.

1

Nếu bạn đã đặt nút hoặc bất kỳ điều khiển nào trên một số hộp thoại, điều khiển đó đã ở trạng thái đã tạo. Để xử lý các thông điệp của các điều khiển con này trên hộp thoại này, bạn phải ghi đè phương thức OnCommand trong lớp đang triển khai hộp thoại của bạn.

Ví dụ:

//CDialog_ControlDlg is my Dialog class derived from CDialog 

//IDC_BUTTON_SAMPLE is the ID of the button which was palced on the dialog in the resource Editor.. 

BOOL CDialog_ControlDlg::OnCommand(WPARAM wParam,LPARAM lparam){ 
     int iNotiFicationMsg=HIWORD(wParam);//This is thenotification Msg from the child control 
     int iCommandId=LOWORD(wParam);//And Control ID of the Child control which caused that Msg 
     BOOL result=FALSE; 
     switch(iCommandId){ 
    case IDC_BUTTON_SAMPLE: 
     if(iNotiFicationMsg==BN_CLICKED) 
     { 
     //Your Code for handling this type of Msg for this control.. 

     } 
     break; 
    default: 
    { 
     //Specific Code; 

    } 

    return result; 
} 

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