首页 > 系统相关 >C语言开发windows程序主要程序结构

C语言开发windows程序主要程序结构

时间:2024-10-02 09:04:29浏览次数:6  
标签:窗口 windows 句柄 程序结构 C语言 wndclass hwnd msg NULL

一、两个函数

1.WinMain,WindowsAPI 主函数。本次示例中WinMain包含的三个内容:
	+.注册窗口
	+.创建窗口
	+.消息循环
2.窗口过程(WndProc)
	窗口过程,通过窗口过程(WndProc)与用户交互和管理窗口。

二、Windows程序示例

基于C语言开发的windows图形界面程序

/**
*	title:Windows 程序
*	date:2024-10-02 
*	author:lanyu
* 	version:C99,C11
*	info:其实窗口过程函数写法都是一个样的。
*/

#include <windows.h>
LPCWSTR reg_class=TEXT("WindowsProgram");  
//声明窗口过程函数。
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//Windows 应用程序接口函数WinMain(主函数)
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrveInstance,LPSTR szCmdLine,int iCmdShow){
	//窗口注册
	WNDCLASS wndclass;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;
	wndclass.hInstance=hInstance;
	wndclass.hBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=reg_class;
	wndclass.lpfnWndProc=WndProcl
	if(!RegisterClass(&wndclass)){
		MessageBox(NULL,TEXT("The Program register class failure."),TEXT("ERROR"),MB_OK|MB_ICONERROR);
		return 0;
	}
	//窗口创建
	HWND hwnd;
	hwnd=CreateWindow(
		 reg_class
		,TEXT("Windows应用程序")
		,WS_OVERLAPPEDWINDOW
		,CW_USEDEFAULT
		,CW_USEDEFAULT
		,CW_USEDEFAULT
		,CW_USEDEFAULT
		,NULL
		,hInstance
		,NULL
		,NULL
	);
	ShowWindow(hwnd,iCmdShow);
	UpdateWindow(hwnd);
	//定义消息循环
	while(GetMessage(&msg,hwnd,0,0)>0){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

return msg.wParam;
}
//定义窗口过程函数内容
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
	switch(msg){
		default:
			return DefWindowProc(hwnd,msg,wParam,lParam);
	}
	return 0;
}

三、各部分解释

接口函数

WINAPI: 原型为__stdcall修饰符,使用window的函数调用方式。

CALLBACK:原型为__stdcall修饰符,使用window的函数调用方式。[和WINAPI一样的作用,可以不区分,但为了语法严谨不建议。]

HINSTANCE:实例句柄。这里的WinMain参数中hInstance实例的句柄是指本程序。参数中第二个hPrveInstance为上一个实例的句柄(以后Windows只会为这个参数传入NULL值)

LPSTR:字符指针,指向一个传入程序的字符串。

INT:原型int,标识这个程序打开后显示方式:显示、隐藏、全屏、最小化等。


窗口注册

WNDLCASS:窗口类结构体

字段 设置
cbWndExtra 窗口附加内存
cbClsExtra 注册类附加内存
style 类样式
hCursor 光标
hIcon 图标
hbrBackground 背景
lpszClassName 注册窗口名
lpszMenuName 菜单[字符串、ID]
lpfnWndProc 窗口过程函数

LoadCursor:加载鼠标光标宏,原型 HCURSOR LoadCursor(HISNTANCE,LPWSTR)

LoadIcon:加载应用图标,原型HICON LoadIcon(HINSTANCE,LPWSTR)

GetStockObject:加载windows默认对象。

RegisterClass:注册窗口。通过指针指向窗口注册结构体。


创建窗口

CreateWindow():创建windows窗口。窗口创建成功后返回一个窗口句柄,这时窗口在桌面是不显示的。

意义 参数
窗口注册字符串 LPCWSTR
窗口名称 LPCWSTR
样式 UINT
X坐标 int
Y坐标 int
int
int
父程序 HWND
菜单 HMENU
实例句柄 HINSTANCE
构建结构体的指针 LPVOID

ShowWindow:显示窗口。第一个参数由CreateWindow返回的窗口句柄,第二个参数是窗口显示的标志位。

UpdateWindow:更新窗口。传递一个窗口句柄。

消息循环

MSG:消息结构体

字段 意义
HWND 窗口句柄
UINT 消息ID
WPARAM 字符型参数
LPARAM 长整型参数
DWPRD 时间戳
POINT 鼠标坐标

GetMessage:获取Widnows操作消息。第一个为指向MSG结构体的指针、第二个为窗口句柄、第三个为最低消息整数值、第四个为最高消息整数值。

TranslateMessage: 翻译键盘消息

DispatchMessage:这个函数会调用WndProc(窗口过程函数)


附加

本示例中窗口过程函数被缩减,目的在于示例。(如下仍然不是最简,最简可以直接调用默认窗口过程。)

	LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
		return DefWindowProc(hwnd,msg,wParam,lParam);
	}

编译命令,假设源文件为: test.c

	gcc -Wshadow -Wall -mwindows -DUNICODE=1 -g test.c -o out.exe

标签:窗口,windows,句柄,程序结构,C语言,wndclass,hwnd,msg,NULL
From: https://www.cnblogs.com/exlanyu/p/18444373

相关文章

  • 个人感悟##C语言中的得与失
    个人练习感悟1.三个任意整数从小到大排序#include<stdio.h>#include<stdlib.h>intmain(){inta,b,c;printf(“我可以为您进行从大到小排序,请任意输入三个的整数:”);scanf(“%d%d%d”,&a,&b,&c);if(a>b&&a>c)if(b>c)printf(“%d,%d,%d”,a,b,c);elseif(b<c)......
  • C语言 typedef
    概念在C语言中,typedef是一个关键字,用于为已有的数据类型定义一个新的别名。它本身并不创建新的数据类型,而是给现有的类型赋予一个更方便、更易理解或更符合项目特定需求的名字。基本用法基本数据类型别名例如,为unsignedint定义一个新的别名uint:typedefunsignedint......
  • C语言 结构体
    结构体的概念在C语言中,结构体(struct)是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个逻辑上相关的整体。它类似于一个容器,可以容纳多种不同类型的数据项。结构体的定义结构体的定义语法如下:struct结构体名{成员类型1成员名1;成员类型2成......
  • C语言 形参和实参
    在C语言中,强制类型转换(强转)可能会导致精度发生变化,具体情况取决于转换的类型。数值类型转换浮点数转换为整数当把浮点数强制转换为整数时,小数部分会被直接截断,精度必然会发生变化。例如:floatnum=3.14;intresult=(int)num;//此时result的值为3,小数部分0.14被截断......
  • c语言中的链接性和作用域
    什么是链接性链接性指的是标识符(如变量、函数)在多个翻译单元(通常是多个源文件)之间共享和可见的能力。链接性决定了标识符的作用范围,即它能在多大范围内被访问或引用链接性无链接性:标识符只能在局部作用域内使用,通常用于局部变量内部链接性:标识符只能在定义它的文件内使用,使......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1#include<stdio.h>intmain(){printf("oo\n");printf("<H><H>\n");printf("IIII\n");return0;} 2.实验任务2//从键盘上输入三个数据作为三角形边长,判断其能否构成三角形//构成三......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1task1_1.c#include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");printf("o\n");printf("<H>\n");printf("II\n&q......
  • windows10如何安装jdk8,并且配置java home环境?超详细!
    前言大家好,我是小徐啊。记得我刚学习Java的时候,我的老师第一步就是教我们如何安装jdk并且配置java环境。这应该算是学习Java的第一步吧。虽然这个安装过程对我来说已经不是非常难了,但是我知道,对于一些刚入门的小伙伴还是经常容易搞错的,所以,今天小徐就写一篇详细的教程,来帮助大家......
  • Windows批处理文件编写指南
    有时候为了提高效率,我们可以将一些DOS命令写在一个批处理文件中集中运行和处理,下面介绍一下编写一个批处理文件的必要步骤和知识:1、首先需要用编辑器或记事本创建一个普通文件2、根据功能编写指令,基础常用命令如下:@echooff:关闭命令回显,这样在执行命令时不会显示命令本身ec......
  • 初识C语言
    C语言人机交互的一门语言 一刚发明计算机时人们普遍用着二进制语言也就是0和1的组合,那时的人们要编程,要翻书对应其数字0和1代表的意义,后来人们将一些常见的0和1写成助记符于是就形成了汇编语言,然而汇编语言仍然不够省事,于是人们苦思冥想,想出了编译器这一转折性的app,人们......