int CWnd::MessageBox( LPCSTR lpszText,
LPCSTR lpszTitle = NULL,
UINT MBType = MB_OK);

| MB_OK | มีปุ่มกด OK เพียงปุ่มเดียว |
| MB_OKCANCEL | มีปุ่มกด OK และปุ่ม CANCEL |
| MB_YESNO | มีปุ่มกด YES และปุ่ม NO |
| MB_YESNOCANCEL | มีปุ่มกด YES, ปุ่ม NO, และปุ่ม CANCEL |
| MB_RETRYCANCEL | มีปุ่ม RETRY และปุ่ม CANCEL |
| MB_ABORTRETRYIGNORE | มีปุ่ม ABORT, ปุ่ม RETRY, และปุ่ม IGNORE |
| MB_ICONEXCLAMATION | แสดงรูป | ![]() |
| MB_ICONINFORMATION | แสดงรูป | ![]() |
| MB_ICONQUESTION | แสดงรูป | ![]() |
| MB_ICONSTOP | แสดงรูป | ![]() |

| ปุ่มกด | ค่าที่ส่งกลับ |
|---|---|
| Abort | IDABORT |
| Cencel | IDCANCEL |
| Ignore | IDIGNORE |
| Yes | IDYES |
| No | IDNO |
| Retry | IDRETRY |
| OK | IDOK |






ให้ดับเบิ้ลคลิ๊ก ที่ช่องสี่เหลี่ยมนั้น ก็จะได้ dialog box ของ คุณสมบัติของ menu (menu item property) ขึ้นมา ให้สังเกตว่า มีเครื่องหมาย ตรง check box ของ Pop-up เพื่อบอกว่า เมนูนี้เป็น pop-up menu ซึ่งจะเป็นตัวเรียก เมนูย่อยอื่น ๆ ขึ้นมาเท่านั้น แต่จะไม่มีการส่ง message ใด ๆ กลับมาให้โปรแกรมของเรา จึงไม่จำเป็นต้องมี หมายเลย ID ดังนั้นในช่อง ID ของเมนูนี้ จะเป็นสีเทา ไม่สามารถตั้งชื่อ ID ให้กับเมนูนี้ได้ แต่เราสามารถตั้ง ชื่อ ที่จะแสดงบนเมนูย่อยนี้ได้ ดังแสดงในช่อง Caption โดยตั้งชื่อเป็น &Message box เครื่องหมาย & ที่อยู่หน้าตัวอักษร M จะทำให้ ตัว M มีการขีดเส้นใต้ และสามารถใช้คีย์ Alt+M เพื่อเรียกเมนูนี้ออกมาได้

จากนั้น ให้คลิ๊กตรงช่องสี่เหลี่ยม ด้านล่างของ เมนู Message box ก็จะได้ dialog box ของเมนูย่อย ออกมา โดยเมนูย่อยนี้ จะไม่มีเครื่องหมายตรง check box ของ Pop-up แสดงว่า เมนูย่อยนี้ จะสามารถส่ง message ไปให้หน้าต่างโปรแกรมของเราได้ ให้เราตั้งชื่อ Caption ของเมนูนี้เป็น &Yes-no box และตั้งชื่อ ID (ที่จะส่งกลับ เมื่อมีการเลือกเมนูนี้) ให้เป็น IDM_YESNO (เราสามารถตั้งเป็นชื่ออื่นได้ตามใจชอบ แต่ควรให้ขึ้นต้นด้วย IDM_ เพื่อ บอกให้รู้ว่าเป็น ID ของ Menu

แล้วใช้วิธีเดียวกัน ในการสร้างเมนูย่อย ที่ชื่อว่า Yes-no-&Cancel box และมี ID เป็น IDM_YESNOCANCEL กับเมนูย่อย ที่ชื่อ &Abort-retry-ignore box และมี ID เป็น IDM_ABORTRETRYIGNORE ตามลำดับ


คราวนี้เราจะมาทำเมนู เพื่อออกจากโปรแกรมนี้กัน โดยให้คลิ๊กเมาส์ ตรงช่องสี่เหลี่ยมด้านขวาบน ของเมนูบาร์ จะได้ Dialog box ออกมา ซึ่ง จะมีเครื่องหมายตรง check box Pop-up และช่อง ID จะเป็นสีเทา เพราะเมนูที่อยู่บนเมนูบาร์ ส่วนใหญ่มัก จะเป็นเมนู ที่ใช้เรียกเมนูอื่น อีกทีหนึ่ง (pop-up menu) แต่เราต้องการให้ เมนูนี้ส่ง message ให้หน้าต่างโปรแกรม ของเรา จึงต้องเอาเครื่องหมายตรง check box Pop-up ออก จะทำให้ช่อง ID สามารถป้อนค่าลงไปได้ ให้เราตั้งชื่อเมนูนี้เป็น E&xit และตั้ง ID เป็น IDM_EXIT ดังแสดงในรูป


แล้วจึงมาคลิ๊กเลือกเมนู File -> Save all เพื่อบันทึกเมนูที่เราสร้างขึ้นนี้ เก็บไว้ในไฟล์ simplemenu.rc

จากนั้น คลิ๊กเลือกเมนู File -> Open จะเห็นว่าในโปรเจคท์ของเรา นอกจากจะมี ไฟล์ simplemenu.rc แล้ว ยังมีไฟล์ resource.h อยู่อีกด้วย เดี๋ยวเราจะมาดูว่าไฟล์นี้ ถูกสร้างขึ้นมาได้อย่างไร

คลิ๊กเลือกที่ไฟล์ simplemenu.rc เพื่อจะเปิดไฟล์นี้ โดยให้เลือกที่ list box open as: ให้เป็น Text เพราะ เราจะดู รายละเอียดของไฟล์นี้ ในรูปโค้ดโปรแกรมกัน แล้วคลิ๊กปุ่ม Open (****อย่าลืม! ก่อนที่จะเปิดไฟล์นี้ เราต้องปิด menu editor เสียก่อน โดยคลิ๊กที่เครื่องหมาย X บนมุมบนขวาสุด ของ menu editor เพราะ ไฟล์นี้ จะสามารถเปิดแบบ Text ได้ จะต้องปิดไฟล์เดียวกัน ที่เปิดในแบบ wysiwyg (what you see is what you get) ให้เรียบร้อยเสียก่อน ******)

ในส่วนต้นของ ไฟล์ simplemenu.rc จะมีการ include ไฟล์ที่สำคัญไว้สองไฟล์คือ afxres.h ซึ่งเป็นไฟล์ ที่ใช้กำหนดค่าต่าง ๆ ให้กับ resource ของ MFC ส่วนอีกไฟล์หนึ่งก็คือไฟล์ resource.h ซึ่ง menu editor จะสร้างขึ้นในตอนที่เรา กำหนดค่าต่าง ๆ ให้กับเมนูที่จะสร้าง

และในไฟล์ simplemenu.rc จะต้องมีโค้ดคำสั่งต่อไปนี้อยู่ ซึ่งเป็นคำสั่งในการสร้างเมนูนั่นเอง

MenuName MENU [option]
BEGIN
menuitem
END
| MenuName | คือชื่อของ menu นี้ ซึ่งในที่นี้ menu editor ตั้งชื่อให้ว่า IDR_MENU1 |
| [Option] | คือคำสั่งเพิ่มเติม ในที่นี้คือ DISCARDABLE ซึ่งหมายความว่า เมนูนี้จะถูกถอดออกจากหน่วยความจำ เมื่อไม่ใช้งาน |
| menuitem | จะมี menuitem ได้ 2 แบบ คือ POPUP และ MENUITEM โดยมีรูปแบบคำสั่งดังนี้ |
| MENUITEM | ใช้สร้างเมนูที่คลิ๊กแล้วจะไปเรียกฟังก์ชั่นการทำงานต่าง ๆ โดยมีรูปแบบคำสั่งคือ MENUITEM "itemname", MenuID โดย "itemname" คือชื่อที่จะปรากฎอยู่บนเมนู และ MenuID คือค่าคงที่เฉพาะของเมนูนั้น เช่น IDM_YESNO |
| POPUP | ใช้สร้างเมนูที่ ภายในบรรจุเมนูย่อยอื่น ๆ ไว้ โดยมีรูปแบบคำสั่งคือ POPUP "Popupname" โดย "Popupname" คือชื่อที่จะปรากฎอยู่บนเมนู |



/* simplemenu.h */
/* main window class */
class CMainWin: public CFrameWnd
{
public:
CMainWin( ); /* function constructor */
afx_msg void OnYesNoBox( ); /* ประกาศ function prototype */
afx_msg void OnYesNoCancelBox( );
afx_msg void OnAbortRetryIgnoreBox( );
afx_msg void OnExit( );
DECLARE_MESSAGE_MAP( ) /* ประกาศ การ map message */
};
/* application class */
class CApp: public CWinApp
{
public:
BOOL InitInstance( );
};
จากนั้นให้สร้าง ไฟล์ simplemenu.cpp โดยคลิ๊กที่เมนู File -> New คลิ๊กเลือกแทป Files แล้วเลือกหัวข้อ C++ Source File
ตั้งชื่อไฟล์เป็น simplemenu.cpp แล้วคลิ๊ก OK

/* file simplemenu.cpp */
#include <afxwin.h>
#include <afxres.h> /* ต้อง include ไฟล์นี้ ในทุกไฟล์ที่ใช้งานรีซอรท์ */
#include "simplemenu.h"
#include "resource.h" /* ต้อง include ไฟล์นี้ ในทุกไฟล์ ที่อ้างถึง ID ของ รีซอรท์ */
CMainWin::CMainWin( )
{
Create(NULL,
"Simple Menu",
WS_OVERLAPPEDWINDOW,
rectDefault,
NULL,
MAKEINTRESOURCE(IDR_MENU1)); /* กำหนดค่าเมนู ให้กับ พารามิเตอร์ตัวที่6 ของฟังก์ชั่น Create( )*/
}
BOOL CApp::InitInstance( )
{
m_pMainWnd = new CMainWin( );
m_pMainWnd ->ShowWindow(m_nCmdShow);
m_pMainWnd ->UpdateWindow( );
return TRUE;
}
/*message map */
BEGIN_MESSAGE_MAP(CMainWin,CFrameWnd)
ON_COMMAND(IDM_YESNO,OnYesNoBox) /* มาโครที่ใช้ตอบสนอง ต่อการเลือกเมนู */
ON_COMMAND(IDM_YESNOCANCEL,OnYesNoCancelBox)
ON_COMMAND(IDM_ABORTRETRYIGNORE,OnAbortRetryIgnoreBox)
ON_COMMAND(IDM_EXIT,OnExit)
END_MESSAGE_MAP( )
/* yes-no box function */
afx_msg void CMainWin::OnYesNoBox( )
{
int button; /* กำหนดตัวแปร button เป็นชนิด interger */
/* สร้าง Message box แล้วรอรับค่าปุ่มที่ถูกกด แล้วส่งค่าปุ่มที่ถูกกดบน message box กลับมาเก็บในตัวแปร button */
button = MessageBox("Press yes or no?","YESNO box",MB_YESNO|MB_ICONQUESTION);
if(button==IDYES)
MessageBox("You press yes button",NULL,MB_OK); แสดง Message box นี้เมื่อปุ่ม OK ถูกกด */
else
MessageBox("You press no button"); แสดง Message box นี้เมื่อปุ่ม CANCEL ถูกกด */
}
/* yes-no-cancel function */
afx_msg void CMainWin::OnYesNoCancelBox( )
{
int button;
button = MessageBox("Select one button","YESNOCANCEL BOX",MB_YESNOCANCEL);
switch(button)
{
case IDYES: MessageBox("You select Yes button");
break;
case IDNO: MessageBox("You select No button");
break;
case IDCANCEL: MessageBox("You select Cancel button");
break;
}
}
/* abort-retry-ignore function */
afx_msg void CMainWin::OnAbortRetryIgnoreBox( )
{
int button;
button = MessageBox("Select one button","Abort Retry Ignore Box",MB_ABORTRETRYIGNORE);
switch(button)
{
case IDABORT: MessageBox("You select Abort button");
break;
case IDRETRY: MessageBox("You select Retry button");
break;
case IDIGNORE: MessageBox("You select Ignore button");
break;
}
}
/* exit function */
afx_msg void CMainWin::OnExit( )
{
DestroyWindow( ); /* ปิด โปรแกรมเรา*/
}
CApp myApp; /*สร้าง object ของ คลาส CApp ขึ้นมา ซึ่งเป็นจุดเริ่มต้นการทำงานของโปรแกรมของเรา*/
เมื่อพิมพ์โค้ดโปรแกรมเสร็จเรียบร้อยแล้ว ก็ให้เซฟไฟล์ทั้งหมด โดยคลิ๊กที่เมนู File -> Save All จากนั้นก็ทำการ สร้างโปรแกรมโดยใช้คำสั่ง BUILD->BUILD simplemenu.exe
หรือกดปุ่ม F7 หรือใช้ Toobar ดังที่ได้อธิบายไปแล้วในบทที่ 3 ก็ได้ตามอัธยาศัยค่ะ



BOOL CFrameWnd::Create( LPCSTR ClassName, LPCSTR Title, DWORD Style, RECT size, CWnd *Parent, LPCSTR MenuName, DWORD ExStyle, CCreateContext *Context );
| ClassName | เป็นตัวชี้ ที่ชี้ไปยัง คลาส ที่เก็บรูปแบบ ของหน้าต่างวินโดวส์ของเรา ปกติจะกำหนดเป็น NULL เพื่อให้ใช้ default class ที่สร้างขึ้นโดย MFC |
| Title | เป็นตัวชี้ไปยังตำแหน่งที่เก็บ ชื่อที่จะปรากฏบน title bar ของหน้าต่างโปรแกรมของเรา |
| Style | เป็นตัวกำหนดรูปแบบของหน้าต่างวินโดวส์เรา ซึ่งมีมาโครหลายตัวที่ใช้กำหนดรูปแบบ เช่น
|
| Size | เป็นตัวแปรโครงสร้างชนิด RECT ที่ใช้กำหนด โคออดิเนต ของหน้าต่างวินโดวส์
ที่จะแสดงบนจอภาพ โดยตัวแปร RECT จะมีโครงสร้างดังนี้
typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
ตัวอย่างต่อไปนี้ เป็นการสร้าง หน้าต่างวินโดวส์ ให้ตำแหน่งบนซ้าย อยู่ที่ตำแหน่ง (10,10) และตำแหน่ง
ล่างขวา ของหน้าต่างวินโดวส์ อยู่ที่ตำแหน่ง (200,200) ของจอภาพ โดยจะเขียนโค้ดไว้ใน ส่วนของ
function constructor ของคลาส CMainWin
CMainWin::CMainWin( )
{
RECT r;
r.top = 10;
r.left = 10;
r.bottom = 200;
r.right = 200;
Create(NULL,"Define Window size",WS_OVERLAPPEDWINDOW,r);
}
|
| *Parent | เป็นตัวชี้ ที่ชี้ไปยัง หน้าต่างวินโดวส์แม่ (Parent window) ของหน้าต่างวินโดวส์ของเรา ซึ่งในกรณีนี้ หน้าต่างวินโดวส์ ของเราเป็นหน้าต่างแรกสุด จึงไม่มีหน้าต่างแม่ ต้องกำหนดพารามิเตอร์นี้ เป็น NULL |
| MenuName | ***เป็นชื่อของ menu ที่ต้องการ ติดตั้งเข้าไปใน หน้าต่างวินโดวส์ของเรา ชื่อของเมนูเราจะอยู่ใน ไฟล์ .RC และต้องใช้มาโคร MAKEINTRESOURCE(ชื่อเมนู) ในการกำหนดพารามิเตอร์ตัวนี้ด้วย เพราะชื่อเมนูเรา ถูก menu editor กำหนดเป็นค่าคงที่แบบ integer *** |
| ExStyle & *Context |
เป็นตัวกำหนดรูปแบบ เพิ่มเติมให้วินโดวส์ ในที่นี้ไม่ได้ใช้ ก็ให้กำหนดเป็น 0 และ NULL ตามลำดับ หรือจะใช้วงเล็บปิด หลังจากป้อน MenuName เสร็จแล้วก็ได้ |
class CMainWin: public CFrameWnd
{
public:
CMainWin( ); /* function constructor */
afx_msg void OnYesNoBox( ); /* ประกาศ function prototype ที่จะตอบสนอง ต่อการเลือก menuitem แต่ละตัว */
afx_msg void OnYesNoCancelBox( );
afx_msg void OnAbortRetryIgnoreBox( );
afx_msg void OnExit( );
DECLARE_MESSAGE_MAP( ) /* ประกาศ การ map message */
};
2. เพิ่มมาโคร ที่ใช้จัดการ กับ message WM_COMMAND ลงไปใน message map โดยรูปแบบ
ของมาโครที่ใช้ จะเป็นดังนี้ BEGIN_MESSAGE_MAP(CMainWin,CFrameWnd) ON_COMMAND(IDM_YESNO,OnYesNoBox) /* มาโครที่ใช้ตอบสนอง ต่อการเลือกเมนู */ ON_COMMAND(IDM_YESNOCANCEL,OnYesNoCancelBox) ON_COMMAND(IDM_ABORTRETRYIGNORE,OnAbortRetryIgnoreBox) ON_COMMAND(IDM_EXIT,OnExit) END_MESSAGE_MAP( )3. เขียน โค้ดรายละเอียด ของฟังก์ชั่นที่ตอบสนองต่อ การเลือก menuitem แต่ละตัว ในที่นี้จะยกตัวอย่าง ของ ฟังก์ชั่น OnYesNoBox( ) ที่จะตอบสนอง ต่อการเลือกเมนู ที่มี ID เป็น IDM_YESNO
afx_msg void CMainWin::OnYesNoBox( )
{
int button; /* กำหนดตัวแปร button เป็นชนิด interger */
/* สร้าง Message box แล้วรอรับค่าปุ่มที่ถูกกด แล้วส่งค่าปุ่มที่ถูกกดบน message box กลับมาเก็บในตัวแปร button */
button = MessageBox("Press yes or no?","YESNO box",MB_YESNO|MB_ICONQUESTION);
if(button==IDYES)
MessageBox("You press yes button",NULL,MB_OK); แสดง Message box นี้เมื่อปุ่ม OK ถูกกด */
else
MessageBox("You press no button"); แสดง Message box นี้เมื่อปุ่ม CANCEL ถูกกด */
}
หนูแจ่ว