可视化编程学习笔记·实验一

                                                                          实验一  基本窗口创建 
一、实验目的: 
    1.掌握 Windows 编程基础知识:窗口、事件驱动及消息 
    2.掌握 Windows 应用程序的组成和基本结构 
二、实验要求: 
    1.预习本次实验的实验要求和任务 
    2.熟悉 VC++集成开发环境并独立完成本次实验 
三、实验环境: 
    1.软件:VC++ 6.0 或 Visual Studio 
四、实验内容: 
    1.熟悉 VC++集成开发环境,创建一个 VC 工程,熟悉工程的工作空间 
    2.创建 cpp 文件,编写基本 Windows 应用程序的两个组成部分:WinMain 函数以及窗口函数 
    3.完成 WinMain 函数中的函数说明、窗口类的定义、窗口类的注册、窗口的创建、窗口的显示以及消息循环 
    4.完成窗口函数中的基本消息处理过程 
五、实验过程及结果描述 
    1.在 VC++ 6.0 环境下,选择“新建”,再选择“新建”下的“工程”中的“Win32 Application”,选择要创建的工程所在文件夹,输入要创建的工程文件名 
    2.创建成功后,继续选择“新建”下的“文件”中的“中的“C++ Source File”,输入本工程的 cpp 文件名。 
    3.在本工程的 cpp 文件中输入以下代码: 
WinMain 函数代码如下:

LRESULT CALLBACK WinSunProc(   
    HWND hwnd,      // handle to window   
    UINT uMsg,      // message identifier   
    WPARAM wParam,  // first message parameter   
    LPARAM lParam   // second message parameter 
); 
 
int WINAPI WinMain(   
    HINSTANCE hInstance,      // handle to current instance   
    HINSTANCE hPrevInstance,  // handle to previous instance 
    LPSTR lpCmdLine,          // command line   
    int nCmdShow 
) {  
    WNDCLASS wndcls;  
    wndcls.cbClsExtra=0;  
    wndcls.cbWndExtra=0;  
    HBRUSH hB;     
    hB=CreateSolidBrush(RGB(50,20,200));  //
    wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);  
    wndcls.hbrBackground=hB; wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);                      
    wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); 
    wndcls.hInstance=hInstance;  wndcls.lpfnWndProc=WinSunProc;//     
    wndcls.lpszClassName="WHUT";  
    wndcls.lpszMenuName=NULL;  
    wndcls.style=CS_HREDRAW |CS_VREDRAW;  
    RegisterClass(&wndcls);     
    HWND hwnd;  
    hwnd=CreateWindow("窗口","窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,
NULL,NULL,hInstance,NULL); 
    ShowWindow(hwnd,SW_SHOWNORMAL/*SW_MINIMIZE*/);  
    UpdateWindow(hwnd);  
    MSG msg;  
    while(GetMessage(&msg,NULL,0,0))  {   
    TranslateMessage(&msg);   
    DispatchMessage(&msg);
}  
    return 0; 
} 

窗口函数代码如下: 

LRESULT CALLBACK WinSunProc(   
    HWND hwnd,      // handle to window   
    UINT uMsg,      // message identifier   
    WPARAM wParam,  // first message parameter   
    LPARAM lParam   // second message parameter 
) {  
    switch(uMsg)  { 
    case WM_CLOSE:   
        if(IDYES==MessageBox(hwnd,"是否真的结束?","窗口",MB_YESNO))  
        {    
            DestroyWindow(hwnd);   
        }   
        break;  
    case WM_DESTROY:   
        PostQuitMessage(0);   
        break;  
    default:   
        return DefWindowProc(hwnd,uMsg,wParam,lParam);  
    }  
    return 0; 
} 

在上面例子的基础上,使用定时器,每隔 1 秒,交替的用红色、蓝色和绿色 来填充整个窗口的用户区。 

更改后的窗口函数代码如下:

LRESULT CALLBACK WinSunProc(
	HWND hwnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
) {
		int i = 0;
		static int index = 0;
		static HBRUSH hB[3];
	COLORREF colorindex[3] = { RGB(255,0,0), RGB(0,255,0),RGB(0,0,255) };
	for (;i < 3;i++) {
		hB[i] = { CreateSolidBrush(colorindex[i]) };	//笔刷
	}
	HDC hdc;
	PAINTSTRUCT ptstr;
	
	switch (uMsg)
	{
	case WM_CREATE://定时器
		SetTimer(hwnd, 9999, 1000, NULL);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ptstr);
		SelectObject(hdc, hB[index]);
		Rectangle(hdc, 0, 0, 600, 400);
		DeleteObject(hB[index]);
		index++;
		EndPaint(hwnd, &ptstr);
		if (index%3==0) {
			index = 0;
		}
		break;
	case WM_TIMER:
		if (wParam == 9999)
			SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)hB[index]);
			InvalidateRect(hwnd, NULL, true);
		break;
	case WM_CLOSE:
		if (IDYES == MessageBox(hwnd, L"是否真的结束?", L"窗口", MB_YESNO)) {
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam, lParam);
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值