入门
一、遇到的问题
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)参数说明:
-
ws
指向存储宽字符串的缓冲区的指针。
缓冲区的大小至少为n个宽字符。. -
len
填充ws缓冲区的最大宽字符数。
生成的字符串长度至多为n-1,为额外的’0’留一个空间。 -
format
宽字符串,其中包含格式字符串,其格式与printf中的格式相同。
请注意,所有格式说明符的含义与printf中的相同; 因此,应使用%lc写宽字符(而不是%c),并且%ls应用于宽字符串(而不是%s)。 -
… (附加参数)
同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)参数说明:
-
buffer
输出的存储位置。 -
count
可存储的最多字符数 -
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)参数说明:
- hWnd:
此参数代表消息框拥有的窗口。如果为NULL,则消息框没有拥有窗口。 - lpText:
消息框的内容。如果使用了Unicode库,则把文本变成:
TEXT(/*sometext*/)
- pCaption:
消息框的标题。如果使用了Unicode库,则把文本变成:
TEXT(/*sometext*/)
- 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)参数说明:
- 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)参数说明:
-
hInstance:应用程序当前实例的句柄。无非是一个数值,但标识着我们写的程序,防止多路并发运行一个程序出现的错误。
-
hPrevInstance:应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。对于现在已没有意义。
-
lpCmdLine:指向应用程序命令行的字符串的指针,不包括执行文件名。获得整个命令行。有些Windoes程序在启动时用它把文件装入内存。
-
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)参数说明:
- 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)参数说明:
-
hWnd:窗口句柄。
-
message:消息ID(Message ID) 。
-
wParam:消息参数
-
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)参数说明:
-
hWnd:
-
lpText:
- pCaption:
- uType:
(3)程序示例