windows编程API编程

入门

一、遇到的问题

1、vs编程一闪而过如何解决?

解决方法:在程序结束处一般在return 0;之前加上即可。
system(“pause”);
return 0;

2、自己写一个函数需要怎么做?

解决方法:
1、增加头文件:#include<stdarg.h>
2、声明自己写的函数
3、定义自己写的函数
例子:
#include<windows.h>
#include<tchar.h>
#include<stdarg.h>//头文件
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...);
//声明
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmLine,
	int iCmdShow)
{
	int cxScreen, cyScreen;
	cxScreen = GetSystemMetrics(SM_CXSCREEN);
	cyScreen = GetSystemMetrics(SM_CXSCREEN);
	MessageBoxPrintf(TEXT("屏幕高宽"), TEXT("高度:%d\n宽度:%d\n"), cxScreen, cyScreen);
	return 0;
}
//定义
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat,  ...)
{
	TCHAR szBuffer[1024];
	va_list pArgs;
	va_start(pArgs, szFormat);
	_vsntprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), szFormat, pArgs);
	va_end(pArgs);

	return MessageBox(NULL, szBuffer, szCaption, MB_OK | MB_ICONINFORMATION);
}

3、自己利用向导建立一个WIN32项目?

解决方法:
1、

*、自己写一个函数需要怎么做?

解决方法:
1、增加头文件:#include<stda

二、基本接口函数

1、wchar.h

1)swprintf

来源:坏蛋的博客

(1)函数原型:
int swprintf(wchar_t * ws,size_t len,const wchar_t * format,...;
(2)参数说明:
  1. ws
    指向存储宽字符串的缓冲区的指针。
    缓冲区的大小至少为n个宽字符。.

  2. len
    填充ws缓冲区的最大宽字符数。
    生成的字符串长度至多为n-1,为额外的’0’留一个空间。

  3. format
    宽字符串,其中包含格式字符串,其格式与printf中的格式相同。
    请注意,所有格式说明符的含义与printf中的相同; 因此,应使用%lc写宽字符(而不是%c),并且%ls应用于宽字符串(而不是%s)。

  4. … (附加参数)
    同printf的附加参数,不做过多解释。

(3)程序示例
#include<windows.h>
#include<wchar.h>
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmLine,
	int iCmdShow)
{
	int a = 12;
	wchar_t szBuffer[100];
	swprintf(szBuffer,100, L"Hello %d", a);
	MessageBoxW(NULL, szBuffer, L"Hello", MB_OK | MB_ICONINFORMATION);
	return 0;
}

2、tchar.h

1)_sntprintf

_sntprintf是_snprintf的ANSI和_snwprintf的UNICODE通用定义。本小节介绍的为UNICODE的_snwprintf。

(1)函数原型:
int _snwprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format [,
   argument] ... 
);
(2)参数说明:
  1. buffer
    输出的存储位置。

  2. count
    可存储的最多字符数

  3. format
    窗体控件字符串。

(3)程序示例
//头文件
#include<windows.h>
#include<tchar.h>

//window主函数
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmLine,
	int iCmdShow)
{
	int num = 100;
	TCHAR szBuffer[100];//定义缓存区
	
	//将字符放到缓存区
	_sntprintf(szBuffer, 100,TEXT("安全的:Hello %d"), num);
	
	//利用消息框打印出来缓存区的字符
	MessageBox(NULL, szBuffer, TEXT("Hello"), MB_OK | MB_ICONINFORMATION);
	return 0;
}

3、WinUser.h

1)MessageBox

来源:百度百科

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

MessageBox 利用条件编译根据使用情况进行选择宽版本 (Unicode)的MessageBoxW函数还是窄版本 (ANSI) 的MessageBoxA函数。本小节介绍的为UNICODE的MessageBoxW。

(1)函数原型:
int
WINAPI//__stdcall用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈
MessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType);
/*
_in 输入参数
_out 输出参数
_opt 参数是可选的,就是能够为NULL
_ecount 所指向的缓存的元素个素 也就是括号里的数字
这些宏都被定义为空,只是让程序更容易理解!*/
(2)参数说明:
  1. hWnd:
    此参数代表消息框拥有的窗口。如果为NULL,则消息框没有拥有窗口。
  2. lpText:
    消息框的内容。如果使用了Unicode库,则把文本变成:
TEXT(/*sometext*/)
  1. pCaption:
    消息框的标题。如果使用了Unicode库,则把文本变成:
TEXT(/*sometext*/)
  1. uType:
    指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的按钮以及图标。
    详细参数见百度百科。
(3)程序示例
//头文件
#include<windows.h>
#include<tchar.h>

//window主函数
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmLine,
	int iCmdShow)
{
	int num = 100;
	TCHAR szBuffer[100];//定义缓存区
	
	//将字符放到缓存区
	_sntprintf(szBuffer, 100,TEXT("安全的:Hello %d"), num);
	
	//利用消息框打印出来缓存区的字符
	MessageBox(NULL, szBuffer, TEXT("Hello"), MB_OK | MB_ICONINFORMATION);
	return 0;
}
2)GetSystemMetrics

GetSystemMetrics是一个计算机函数,该函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。
来源:百度百科

(1)函数原型:
int
WINAPI
GetSystemMetrics(
    _In_ int nIndex);
(2)参数说明:
  1. nIndex:
SM_CXSCREEN = 0 ;//'X Size of screen,屏幕分辨率宽度
SM_CYSCREEN = 1 ;//'Y Size of Screen,屏幕分辨率长度
根据显示器显示的不同,系统数据可能有所不同.
(3)程序示例
#include<windows.h>
#include<tchar.h>
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmLine,
	int iCmdShow)
{
	TCHAR szBuffer[100];
	int cxScreen, cyScreen;
	cxScreen = GetSystemMetrics(SM_CXSCREEN);//获取屏幕宽度
	cyScreen = GetSystemMetrics(SM_CYSCREEN);//获取屏幕高度
	
	//将字符串以及数值放到缓存区中
	_sntprintf(szBuffer, 100, TEXT("宽度:%d\n高度:%d\n"), cxScreen, cyScreen);
	MessageBoxW(NULL, szBuffer, TEXT("屏幕高宽:\n"), MB_OK | MB_ICONINFORMATION);
	return 0;
}

4、user.cpp

自己利用向导建立的win32项目自动生成的部分,以及各个函数意义。
1)_tWinMain

来源:u010890209

WinMain是windows API窗体程序的入口函数。(int WINAPI WinMain()) 中 WINAPI是__stdcall宏,在windef.h中定义的。
_tmain _tWinMain 是Unicode版本函数别名,对应与wmain和wWinMain。
_tWinMain和WinMain没太大区别。

<tchar.h>中有如下几行:
#ifdef _UNICODE
#define _tmain      wmain
#define _tWinMain   wWinMain
#else   /* ndef _UNICODE */
#define _tmain      main
#define _tWinMain   WinMain
#endif

这样定义是为了自动适应是否定义了UNICODE,其中wmain和wWinMain是支持UNICODE字符的。
前缀为"_t"的应用与UNICODE的函数,工程中最好用这类函数。

(1)函数原型:
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
(2)参数说明:
  1. hInstance:应用程序当前实例的句柄。无非是一个数值,但标识着我们写的程序,防止多路并发运行一个程序出现的错误。

  2. hPrevInstance:应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。对于现在已没有意义。

  3. lpCmdLine:指向应用程序命令行的字符串的指针,不包括执行文件名。获得整个命令行。有些Windoes程序在启动时用它把文件装入内存。

  4. nCmdShow:指明窗口如何显示。一般是正常显示、最大化、全屏、最小化等

(3)程序示例
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO:  在此放置代码。
	MSG msg;
	HACCEL hAccelTable;

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_MY1, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化: 
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY1));

	// 主消息循环: 
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}

2)MyRegisterClass

MyRegisterClass 函数用于注册该窗口应用程序.
来源:百度百科
详细详细:depaJun

(1)函数原型:
ATOM MyRegisterClass(HINSTANCE hInstance)
(2)参数说明:
  1. hInstance:窗口句柄。
(3)程序示例
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 结构体WNDCLASSEX的大小

	wcex.style			= CS_HREDRAW | CS_VREDRAW;// // 定义窗体样式
	wcex.lpfnWndProc	= WndProc;回调函数
	wcex.cbClsExtra		= 0;// 窗口类额外字节数,通常为0
	wcex.cbWndExtra		= 0;// 窗口实例额外字节数,通常为0
	wcex.hInstance		= hInstance;//进程句柄
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY1)); //图标
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);//鼠标样式
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);//背景
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MY1);//菜单指针
	wcex.lpszClassName	= szWindowClass; //窗体类名
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));// 窗口小图标

	return RegisterClassEx(&wcex);
}
3)WndProc

来源:百度百科
每个窗口会有一个称为窗口过程的回调函数(WndProc),

(1)函数原型:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
(2)参数说明:
  1. hWnd:窗口句柄。

  2. message:消息ID(Message ID) 。

  3. wParam:消息参数

  4. lParam:消息参数

(3)程序示例
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择: 
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
*)user.cpp

自己利用向导建立的win32项目自动生成的部分,以及各个函数意义。

(1)函数原型:

(2)参数说明:
  1. hWnd:

  2. lpText:


  1. pCaption:

  1. uType:
(3)程序示例

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值