VC++深入详解第一章学习笔记

本文介绍了使用MFC和VC++进行Windows编程的基础知识,包括WinMain函数定义、窗口创建流程、消息循环机制及窗口过程函数编写等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    铺天盖地的库函数,纠结啊加蛋疼,真的是硬着头皮开始了MFC的学习,通过VC++深入详解的第一章的学习,初步了解了WINDOWS程序内部的运行机制(其实还是晕晕的),自己试着依样画葫芦实现了一个窗口的创建,算是对VC的学习有了一个初步的印象。

   要创建一个完整的窗口,并在窗口中响应键盘及鼠标消息,要进行以下的步骤。

   1、WinMain函数的定义;

   2、创建一个窗口;

   3、进行消息循环;

   4、编写窗口过程函数;


对于第一个步骤WinMain函数的定义如下:

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
);


对于第二个步骤创建一个完整的窗口,需要经过几个操作步骤,分别是设计一个窗口类,注册一个窗口,创建窗口,显示及更新窗口。

对窗口进行设计:

    WNDCLASS wndclass;                           
    wndclass.style=CS_BYTEALIGNCLIENT;
    wndclass.lpfnWndProc=first;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
    wndclass.hCursor=LoadCursor(NULL,IDC_HELP);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName="林的WINDOWS程序";
注册窗口类:

RegisterClass(&wndclass);

创建及显示窗口:

	HWND hwnd;
	hwnd=CreateWindow("林的WINDOWS程序","菜鸟的无奈",WS_OVERLAPPEDWINDOW,0,0,600,600,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,SW_SHOWNORMAL);

第三个步骤是进行消息循环:

MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

第四个步骤也是WINDOWS编程中最核心的步骤是窗口过程函数的编写:

LRESULT CALLBACK first(
    HWND hwnd,
    UINT umsg,
    WPARAM wParam,
    LPARAM lParam
)
{
	switch(umsg)
	{
	case WM_CHAR:
		char str[100];
		sprintf(str,"1+1",0);
		MessageBox(hwnd,str,"菜鸟的无奈",0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"鼠标输入","菜鸟的无奈",0);
		HDC hdc;
		hdc=GetDC(hwnd);
		TextOut(hdc,0,50,"晕头转向",strlen("晕头转向"));
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC=BeginPaint(hwnd,&ps);
		TextOut(hDC,0,0,"纠结啊纠结",strlen("纠结啊纠结"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:
		if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,umsg,wParam,lParam);
	}
	return 0;
}

     不得不说,这几段代码包含了许多的知识点,虽然写出了这些代码,但是许多的知识点与原理还需要继续领悟巩固加强,下面附上一段完整的代码,虽然只是一段很简单的代码,但是也还是花了自己很多时间,毕竟刚开始学。

#include <stdio.h>
#include <windows.h>
LRESULT CALLBACK first(
    HWND hwnd,
    UINT umsg,
    WPARAM wParam,
    LPARAM lParam
)
{
	switch(umsg)
	{
	case WM_CHAR:
		char str[100];
		sprintf(str,"1+1",0);
		MessageBox(hwnd,str,"菜鸟的无奈",0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"鼠标输入","菜鸟的无奈",0);
		HDC hdc;
		hdc=GetDC(hwnd);
		TextOut(hdc,0,50,"晕头转向",strlen("晕头转向"));
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC=BeginPaint(hwnd,&ps);
		TextOut(hDC,0,0,"纠结啊纠结",strlen("纠结啊纠结"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:
		if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,umsg,wParam,lParam);
	}
	return 0;
}
int WINAPI WinMain(
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPSTR lpCmdLine, 
  int nShowCmd 
)
{
	WNDCLASS wndclass;                           
	wndclass.style=CS_BYTEALIGNCLIENT;
	wndclass.lpfnWndProc=first;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
    wndclass.hCursor=LoadCursor(NULL,IDC_HELP);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName="林的WINDOWS程序";
	RegisterClass(&wndclass);
	HWND hwnd;
	hwnd=CreateWindow("林的WINDOWS程序","菜鸟的无奈",WS_OVERLAPPEDWINDOW,0,0,600,600,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,SW_SHOWNORMAL);
	MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

    要学的还有很多很多,呵呵,烦恼而又乐在其中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值