MOOC清華《VC++面向對象與可視化程序設計》第5章:對話框資源例程(非模態對話框樣例)

#include <windows.h>                      
#include "001.h"
HWND hdlg; //對話框句柄
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(	HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{	HWND hwnd ;
	MSG Msg ;
	HACCEL hAccel;
	WNDCLASS wndclass ;
	char lpszMenuName[]="Menu";
	char lpszClassName[] = "非模態對話框"; 
	char lpszTitle[]= "非模態對話框演示程序";
	wndclass.style = 0;                   
	wndclass.lpfnWndProc = WndProc ;    
	wndclass.cbClsExtra	= 0 ;          
	wndclass.cbWndExtra	= 0 ;          
	wndclass.hInstance = hInstance ;       
   	wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;   
 	wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;   
	wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;   	
    wndclass.lpszMenuName =  lpszMenuName ;                       
    wndclass.lpszClassName = lpszClassName ;                   
	if( !RegisterClass( &wndclass))       
	{
	  MessageBeep(0) ;
	  return FALSE ;
	}
	hwnd = CreateWindow(lpszClassName,     
						lpszTitle,     
						WS_OVERLAPPEDWINDOW,   
						CW_USEDEFAULT, 
       	        	    CW_USEDEFAULT,
           	    	 	CW_USEDEFAULT,
               		 	CW_USEDEFAULT,    
						NULL,       
						NULL,      
						hInstance,    
						NULL) ;      	
	ShowWindow( hwnd, nCmdShow) ;
	UpdateWindow(hwnd); 
	hInst=hInstance;
	hAccel=LoadAccelerators(hInst,lpszMenuName);      
	while( GetMessage(&Msg, NULL, 0, 0))
	{  
    //截獲非模態對話框消息併發往處理函數
	if(!IsDialogMessage(hdlg,&Msg))
	 {
	 if(!TranslateAccelerator(hwnd,hAccel,&Msg))
	   {
		TranslateMessage( &Msg) ;
		DispatchMessage( &Msg) ;
	   }
	 }
   }
   return Msg.wParam;      
}
    

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM  wParam,LPARAM  lParam)
{
 switch(message)
 {
   case WM_COMMAND:
	switch(LOWORD(wParam))
	  {
		case IDM_NEW:
			MessageBox(hwnd,"文件創建成功!","文件創建",MB_OK);
   			break;
  		case IDM_OPEN:
			MessageBox(hwnd,"文件打開成功!","文件打開",MB_OK);
   			break;
		case IDM_SAVE:
			MessageBox(hwnd,"文件保存成功!","文件保存",MB_OK);
   			break;
		case IDM_EXIT:
			SendMessage(hwnd,WM_DESTROY,0,0);
   			break;
	    case IDM_ABOUT:
			//調用函數CreateDialog創建非模態對話框
			hdlg=CreateDialog(hInst,"About",hwnd,(DLGPROC)DlgProc);
		    break;
     }
	 break;
  case WM_DESTROY:          
  	 PostQuitMessage(0);   
     break;   
  default:                  
     return  DefWindowProc(hwnd,message,wParam,lParam);			
  }
  return 0;
}

//對話框窗口處理函數
BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
 switch(message)
 {
  case WM_INITDIALOG:	//初始化消息框 
	return 1;
  case WM_COMMAND:		//處理消息框消息
	switch (LOWORD(wParam))
	{
	 case IDOK:
	   DestroyWindow( hdlg) ;
    }
    break;
  case WM_CLOSE:
	DestroyWindow( hdlg) ;
    break;
  }
  return 0;     
}
			


#define IDM_NEW 10
#define IDM_OPEN 11
#define IDM_SAVE 13
#define IDM_EXIT 15
#define IDM_ABOUT 20

#include <windows.h>
#include "001.h"

Menu MENU DISCARDABLE 
{
  POPUP "文件(&F)"
	{   
	  MENUITEM "新建(&N)\t Ctrl+N",           IDM_NEW
	  MENUITEM "打開(&O)\t Ctrl+O",           IDM_OPEN
      MENUITEM SEPARATOR                           
      MENUITEM "保存(&S)\t Ctrl+S",            IDM_SAVE
      MENUITEM SEPARATOR                           
      MENUITEM "退出(&X)",                    IDM_EXIT
    }
 
  POPUP "幫助(&H)"
  	{
  		MENUITEM "關於(&A)...",                 IDM_ABOUT
  	}
}
	
Menu ACCELERATORS  
{
	"^N",             IDM_NEW                  
	"^O",             IDM_OPEN                  
	"^S",             IDM_SAVE                 
}

About DIALOG  50, 50, 100, 50
STYLE DS_MODALFRAME|WS_POPUP | WS_CAPTION | WS_SYSMENU|WS_VISIBLE//非模態對話框
                                            //的風格中應包含WS_VISIBLE
CAPTION "關於"
FONT 12, "楷體"
{
	CTEXT           "Windows對話框示例",-1,13,10,80,10
	DEFPUSHBUTTON   "確定",IDOK,35,30,30,12
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章