VC----对话框Dialog

一个非模态对话框,当作主窗体的创建:(符合窗口创建的步骤)

第一步:补充一个模板,在RC脚本文件文件中,这是和普通窗口不一样的地方。这利益于编译器和链接器的支持呀。

          

#include "windows.h"


121 DIALOG 20, 20, 102, 122  //这里如果用IDD_MYDLG替代121的话,不能用MAKEINTRESOURCE转变成字符串
STYLE WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX 
CLASS "DialogCls"  //表示本模板所属于的自定义的类名,会在定义窗口类WNDCLASS时使用
CAPTION "我的对话框"  
{  
}

MyIcon ICON "1.ico"//这个图标,MyIcon能标识图标,

第二步:使用一个头文件,可以任意命名。如resource.h,加入到工程中,作用是用于上面的图标,MyIcon

      

#include "windows.h"

#define IDD_MYDLG 121  //注意和RC文件中的对应,这里的IDD_MYDLG能表示对话框资源了
#define IDI_
	case WM_CREATE:
		{
		HWND hBtn=	CreateWindow("button","btn",WS_CHILD|WS_VISIBLE,0,0,40,40,hwnd,NULL,g_hInstance,NULL);
		 hDlg = CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_D1),hwnd,(DLGPROC)GoToProc);
		 if(hDlg==NULL)
			 MessageBox(hwnd,"","",MB_OK);
		break;
		}

ICON1 111 //同理,IDI_ICON1能表示 图标资源了 //使用标识的作用是为了比字符串少占用空间,但在代码中要使用MAKEINTRESOURCE宏把资源ID标识转变为字符串标识

第三步:创建和注册窗口类,创建窗口,显示窗口,消息循环

#include "windows.h"
#include "resource.h"

LRESULT WINAPI WndProc(
    HWND hDlg,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);
int WINAPI WinMain(  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
  )
{
	static char * szClassName="DialogClass";
	WNDCLASS wndclass;  
  
    wndclass.style         = CS_HREDRAW | CS_VREDRAW;  
    wndclass.lpfnWndProc   = WndProc ;  
    wndclass.cbClsExtra    = 0 ;  
    wndclass.cbWndExtra    = DLGWINDOWEXTRA ;    // 这里扩展窗口,指明是对话框窗口 见MSDN
    wndclass.hInstance     = hInstance ;  
    wndclass.hIcon         = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));//LoadIcon (hInstance, "MyIcon") MyIcon作为图标的字符串标识时可以
                                                                          //这样用 ;  //注意使用的是本程序(hInstance)的图标资源,资源名字是MyIcon
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;  
    wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;  
    wndclass.lpszMenuName  = NULL ;  
    wndclass.lpszClassName =  "DialogCls"; //类名一个要使用
	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("failed"),TEXT("return"),MB_YESNO);
		return 0;
	}
	HWND hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDLG),NULL,0);//这里模板的名字也可以用 只是用的是字符串

	ShowWindow(hwnd,nCmdShow);
	MSG msg;
	while (GetMessage (&msg, NULL, 0, 0))
    {
         TranslateMessage (&msg);
         DispatchMessage (&msg) ;
    }
	return 0;
}

LRESULT WINAPI  WndProc(
   HWND hDlg,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
)
{
	switch(Msg)
	{
	case WM_SYSCOMMAND:
		switch(wParam)
		{
		case SC_CLOSE: PostQuitMessage(0);break;
		case SC_MAXIMIZE:break;
		default :break;
		}
		break;
	}
	return DefDlgProc(hDlg,Msg,wParam,lParam);//使用默认的对话框处理过程
}


模态对话框:

需要知道的知识:DialogBox函数的作用如下--

              载入模板资源,省去了对一般资源的LoadResource的操作。

              指定窗口过程。显示窗口,活动了ShowWindow的操作,无论在模板中是不是指定了style WS_HIDE风格。用窗口过程来接收消息,但是没有看到GetMessage死循环,难道也由此函数完成了?就当是在DialogBox内部调用了GetMessage循环吧。

      “模态”有点你是MessageBox,对话框不消除,主窗体不能接收消息的。

              函数EndDialog来销毁窗口,也会让系统来结束与此窗口有关联的窗口过程(一般的窗口过程是PostQuitMessage来结束的)。第二个参数是DialogBox要返回的数值。

BOOL EndDialog(  HWND hDlg,        // handle to dialog box
  INT_PTR nResult   // value to return);

INT_PTR CALLBACK ModalDlgProc(
   HWND hwndDlg,
  UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);


DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_MODAL),hDlg,(DLGPROC)ModalDlgProc);//IDD_MODAL模板编号,在.h
//中定义

INT_PTR CALLBACK ModalDlgProc(
    HWND hwndDlg,
    UINT uMsg,
   WPARAM wParam,
   LPARAM lParam
)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
        break;
    case WM_SYSCOMMAND:
        if(wParam==SC_CLOSE)
            EndDialog(hwndDlg,wParam);//wParam是DialogBox的返回值。
            return true;//不再调用 默认的DefDlgPro()过程了
        break;
    default :
        break;
    }
    return false;//以后消息的处理由DefDlgProc来处理
}


 3、模态对话框(不作为主窗体)

        脚本代码如下:

121 DIALOG 180, 80, 50, 50  //这里如果用IDD_MYDLG替代121的话,不能用MAKEINTRESOURCE转变成字符串
STYLE WS_OVERLAPPEDWINDOW|WS_SYSMENU 
//CLASS “aaa”    定义于一个类是不行的,否则界面不能出现,只有当对话框当主窗体时才需要
CAPTION "杨杨"  
{
	PUSHBUTTON "dd", 2,60,0,30,30


代码如下:

	case WM_CREATE:
		{
		HWND hBtn=	CreateWindow("button","btn",WS_CHILD|WS_VISIBLE,0,0,40,40,hwnd,NULL,g_hInstance,NULL);
		 hDlg = CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_D1),hwnd,(DLGPROC)GoToProc);
		 if(hDlg==NULL)
			 MessageBox(hwnd,"","",MB_OK);
		break;
		}


 

	case WM_COMMAND:
		ShowWindow(hDlg,SW_SHOW);
		break;


点击按钮时出非模态对话框。


 

	case WM_CLOSE:
		MessageBox(hwndDlg,"","close",MB_OK);
		ShowWindow(hwndDlg,SW_HIDE);
		break;
	case WM_DESTROY:
		MessageBox(hwndDlg,"","Destroy",MB_OK);
		break;
点击对话框的窗体关闭按钮时,能得到WM_CLOSE消息,但不会销毁(得不到WM_DESTROY消息),只有当主窗体销毁时才会销毁
对话框。可以人为销毁。



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值