MFC的App类是干嘛的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC的App类是干嘛的?相关的知识,希望对你有一定的参考价值。
用向导创建的MFC,一般都有一个app类。
这个类一般我都不动它,写程序都写在Dlg和View里了,现在有些好奇,这个类是干嘛的?什么时候才会要去动它。
App : Application的缩写
app类派生于CWinApp,封装了windows应用程序控制和属性(有别于dos控制台程序等程序类型),是程序的主进程控制类和入口。
如果是初学,首先要了解两点:
InitInstance这个app类成员函数,是整个程序的入口函数,对参数、启动逻辑的控制要放在这里。
app类是很好的全局变量、全局函数替代。因为在整个程序中,这个类始终只有一个实例并全局方便访问,在程序的任何地方,你都可以通过AfxGetApp()访问到它,这样,类成员变量就等同于一个安全的全局变量。
Win32 Console Application (控制台程序)这个是干嘛的?为啥新手开始要学的这个?
这是Windows控制台程序,也就是32位Windows的命令行程序。新手学这个,主要是不需要处理图形界面。可以直接专注于实现核心逻辑。降低你入门的门槛。 参考技术A 仿真8086机器,最简单的C语言编程套路,C语言入门,排除非核心问题干扰学完这个可以接着学习API,MFC或C# 参考技术B 入门级别的,我以前学的时候老师都不讲的,让你自己网上查,然后用Console做一个及时通讯软件。
看看我这个程序吧 注释很详细
// windows窗口.cpp : 定义控制台应用程序的入口点.
/*If this parameter is NULL, GetModuleHandle returns a handle to
the file used to create the calling process.
所以“GetModuleHandle(NULL)”返回的就是当前程序实例句柄。
*****->"MSDN论坛"*********/
#include "stdafx.h"
#include <iostream>
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
//动态菜单
#define IDM_FILE_NEW 40001
#define IDM_FILE_OPEN 40002
#define IDM_EDIT_COPY 40003
#define IDM_EDIT_CUT 40004
//参见"MSDN论坛" 宏定义
#define MAX_STR 100
// 全局变量:
HINSTANCE hInst;
TCHAR szTitle[MAX_STR] = _TEXT("win32控制台窗口"); // 标题栏文本
TCHAR szWindowClass[MAX_STR] = _TEXT("win32"); // 主窗口类名文本
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int _tmain(int argc, _TCHAR* argv[])
HINSTANCE hInstance = NULL;
int nCmdShow = SW_SHOW; // 该变量取值参见MSDN论坛
hInstance = GetModuleHandle(NULL);
MSG msg;
MyRegisterClass(hInstance);
//动态菜单
HMENU hMenu = CreateMenu(); //主菜单,水平
HMENU hMenuPop = CreateMenu(); //下拉的菜单,垂直
AppendMenu(hMenuPop,MF_STRING,IDM_FILE_NEW,_T("New"));
AppendMenu(hMenuPop,MF_STRING,IDM_FILE_OPEN,_T("Open"));
AppendMenu(hMenu,MF_POPUP,(unsigned int)hMenuPop,_T("File"));
//把下拉的菜单加载到主菜单第一个菜单,说的有点形象,
//自己运行程序看效果
hMenuPop = CreateMenu();
AppendMenu(hMenuPop,MF_STRING,IDM_EDIT_COPY,_T("Copy"));
AppendMenu(hMenuPop,MF_STRING,IDM_EDIT_CUT,_T("Cut"));
AppendMenu(hMenu,MF_POPUP,(unsigned int)hMenuPop,_T("Edit"));
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
printf("Error in InitInstance()!");//如果初始化失败 发出警告 返回"Error in InitInstance()!"
return FALSE;
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return (int) msg.wParam;
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
/*
//窗口的样式
//CS_HREDRAW 表示当水平方向宽度发生变化时重绘整个窗口
//CS_VREDRAW 表示当垂直方向高度发生变化时重绘整个窗口
//CS_NOCLOSE 禁用系统菜单中的Close命令,既是没有关闭按钮
//CS_DBLCLKS 当用户双击鼠标时向窗口过程函数发送鼠标双击消息
使用|把多种窗口样式连接在一起
//CS_HREDRAW 水平重画,CS_VREDRAW 垂直重画,CS_NOCLOSE 系统菜单中没有CLOSE菜单项
*/
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
//窗口函数(消息处理函数),lpfnWndProc是个函数指针
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
//当前实例的句柄
wcex.hInstance = hInstance;
/*
//窗口的图标,如果为NULL,系统将提供一个默认的图标
//LoadIcon()加载图标资源,返回图标句柄,
//如果加载系统标准的图标第一个参数必须为NULL,第二个参数值为
//IDI_ERROR 错误图标
//IDI_APPLICATION 默认应用程序图标
//IDI_QUESTION 问号图标
//IDI_EXCLAMATION 感叹号图标
//IDI_ASTERISK 星号图标
//IDI_WARNING 警告图标
//IDI_WINLOGO Windows图标
//IDI_HAND 与IDI_ERROR相同
//IDI_INFORMATION 消息图标
//还有很多.....
*/
wcex.hIcon = LoadIcon(NULL,IDI_APPLICATION);
//设置光标为一个小手指;使用与LoadIcon()相同
wcex.hCursor = LoadCursor(NULL,IDC_HAND);
//背景颜色,这里有两种方法
/* 一种://GetStockObject()返回的句柄是HGDIOBJ类型,需要转换,
//可以加载画刷,也可以加载画笔,
//GetStockObject()参数的值有(看MSDN)
//BLACK_BRUSH 黑色画刷
//DKGRAY_BRUSH 深灰色画刷
//GRAY_BRUSH 灰色画刷
//WHITE_BRUSH 白色画刷
//MyWndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); */
/*二种:*/
wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVEBORDER);
//一种,MAKEINTRESOURCE()加载菜单
wcex.lpszMenuName = NULL;
//窗口类名
wcex.lpszClassName = szWindowClass;
//wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
//
// 函数: InitInstance(HANDLE, int)
//
// 目的: 保存实例句柄并创建主窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
//创建窗口,返回窗口的句柄
HWND hWnd;
// 将实例句柄存储在全局变量中
hInst = hInstance;
//创建窗口,返回窗口的句柄
hWnd = CreateWindow(szWindowClass,//窗口类名称
szTitle, //窗口标题
/*
//这个样式要与WNDCLASS的样式区别开,这个是指定某个具体窗口的样式
//而WNDCLASS的样式是指基于该窗口类的所有窗口都具有的样式
//WS_OVERLAPPED 一个可层叠窗口
//WS_CAPTION 有标题栏
//WS_SYSMENU 在标题栏带有系统菜单,WS_CAPTION一起使用
//WS_THICKFRAME 具有可调边框窗口
//WS_MINIMIZEBOX 有最小按钮,必须设定WS_SYSMENU
//WS_MAXIMIZEBOX 有最大按钮,必须设定WS_SYSMENU**********/
//窗口样式,多种样式
WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX ,
2, //x坐标,默认********CW_USEDEFAULT仅适用于WS_OVERLAPPED样式窗口
2,//y坐标,默认
00, //宽
600,//高
NULL,//父窗口
/*
//LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)),
//第二种加载菜单
//hMenu, //动态菜单 \
*/
NULL, //第一种加载菜单
hInstance, //窗口实例标记
NULL);//窗口创建时传入的数据指针,多文档时必须指向CLIENTCREATESTRUCT
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
//
// 函数: WndProc(HWND, unsigned, WORD, LONG)
//
// 目的: 处理主窗口的消息。
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
PAINTSTRUCT ps;
HDC hdc;
char szHello[] = "未来为你而准备着!!";
switch (message)
case WM_CREATE:
printf( "Hello! I'm a CONSOLE. The WINDOW is my baby." );
break;
/***** case WM_PAINT:
TCHAR str[] = _T("这是一个Windows的SDK程序!");
HDC hDc;
PAINTSTRUCT Ps;
hDc = BeginPaint(hwnd,&Ps); //获取设备环境句柄
SetTextColor(hDc,RGB(13,25,200)); //设置文本颜色
TextOut(hDc,0,0,str,18); //输出文字
EndPaint(hwnd,&Ps); //释放资源
break;
****/
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//获取设备环境句柄或者叫获取资源
SetTextColor(hdc,RGB(13,25,200));
TextOutA(hdc,80,150,szHello, strlen(szHello));// TextOut()-> TextOutA()字符转换解决问题
EndPaint(hWnd, &ps);//释放资源
break;
case WM_CLOSE: //点击"X"按钮时发送此消息,使消息循环停止
if(IDYES == MessageBox(hWnd,_T("是否要退出?"),_T("提示"),MB_YESNO))
DestroyWindow(hWnd); //销毁窗口,发送WM_DESTROY消息,注意程序进程还没退出
break;
case WM_DESTROY://进程结束,完全退出程序
PostQuitMessage(0);
printf("退出!");
break;
case WM_COMMAND: //相应菜单消息
switch(LOWORD(wParam))
//相应直接加载的菜单消息
/*
case ID_40001: MessageBox(hwnd,_T("菜单文件里的新建"),_T("菜单"),MB_OK); break;
case ID_40002: MessageBox(hwnd,_T("菜单文件里的打开"),_T("菜单"),MB_OK);break;
case ID_40003: MessageBox(hwnd,_T("菜单文件里的保存"),_T("菜单"),MB_OK);break;
case ID_40004: MessageBox(hwnd,_T("菜单文件里的另存为"),_T("菜单"),MB_OK);break;
case ID_40005: PostQuitMessage(0); break;
*/
//相应动态菜单消息
case IDM_FILE_NEW: MessageBox(hWnd,_T("动态菜单File里的New"),_T("菜单"),MB_OK); break;
case IDM_FILE_OPEN: MessageBox(hWnd,_T("动态菜单File里的Open"),_T("菜单"),MB_OK); break;
case IDM_EDIT_COPY: MessageBox(hWnd,_T("动态菜单Edit里的Copy"),_T("菜单"),MB_OK); break;
case IDM_EDIT_CUT: MessageBox(hWnd,_T("动态菜单Edit里的Cut"),_T("菜单"),MB_OK); break;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);//处理未处理的消息
return 0;
以上是关于MFC的App类是干嘛的?的主要内容,如果未能解决你的问题,请参考以下文章