第一部分、windows编程基础
1、一个windows窗体
#include<windows.h>
LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);//声明一个回调函数
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevintace ,LPSTR lpCmdLine ,int iCmdShow) //WINmain 函数入口
{
HWND hwnd;//窗口句柄
MSG msg;//消息
WNDCLASSEX wndclass;//窗口类
//窗口类的初始化
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Hellow word";
if(!RegisterClassEx (&wndclass))//注册窗口
{
MessageBox(NULL,TEXT("启动失败"),TEXT("提示"),MB_ICONERROR);
return 0;
}
//创建窗口
hwnd = CreateWindowEx(NULL,
"Hellow word",
TEXT("HI"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow (hwnd,iCmdShow);//显示
UpdateWindow(hwnd);//刷新
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//翻译
DispatchMessage(&msg);//发送给窗口过程
}
return msg.wParam;
}
//回调函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message ,WPARAM wParam,LPARAM lParam)
{
HDC hdc;//设备描述句柄
PAINTSTRUCT ps;//窗口绘制客户区
RECT rect;//矩形结构
switch(message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Windows 7!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
现在给出了一个从书上学到的windows窗体的建立。
首先讲讲,windows的窗体建立的一个过程把.
1、创建一个windows类。
2、创建一个事件过程程序或WinProc
3、用Windows注册windows类
4、用前面创建的windows类创建一个窗口
5、创建一个能够从事处理程序获得向事件处理程序传递windows信息的主事件循环
首先是windows类:
cbSize:
style:
lpfnWndProc:
cbClsExtra:
cbWndExtra:
hInstance:
hIcon:
hCursor:
hbrBackground:
lpszMenuName:
lpszClassName:
hIconSm:
2、创建一个事件过程程序或WinProc声明一个回调函数
LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);每个窗口会有一个称为窗口过程的
回调函数(
WndProc),它带有四个参数。
hwnd 是一个窗口句柄
msg 这是一个实际的WinProc处理消息的标识符
wparam lparam 是进一步分配或分类发送到msg参数的信息
LRESULT CALLBACK 这些关键字是必须的。别忘记了
3、注册windows类
RegisterClassEx()函数进行注册
4、创建窗口
用CreateWindowEx()函数去创建
函数原型:
HWND WINAPI CreateWindowEx(DWORD dwExStyle,
LPCTSTR IpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
LPVOID lpParam);
WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。
当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个 系统菜单,它的图标也不会显示在 标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。
5、事件处理过程:
这个没什么好讲的。
二、使用资源
1、使用编译器创建.RC文件
2、菜单
事件是:WM_COMMAND
它的lparam 是发出消息的窗口句柄
wparam 是选中菜单的ID
3、GDI
HDC 图形设备描述表
关于这个
BeginPaint() 与EndPaint() 是一对 的,已经将刷新信息包含在里面了
GetHdc() 与ReleaseDC() 一起
ValidateRect() 函数
4、键盘事件
通过,WM_CHAR 或 WM_KEYDOWN WM_KEYUP 或者调用GetAsyncKeyState() 函数进行
WM_CHAR:
wparam 包含所按下键的ASCII
lparam 包含按下键的状态
WM_KEYDOWN WM_KEYUP(松开始才发出):
wparam 虚拟键码
lparam 键状态矢量
5、鼠标 事件
WM_MOUSEMOVE
6、自行发送消息
SandMessage() 向窗口传递一个要求立即处理的消息,该函数紧接着WinProc()返回
PostMessage() 将消息传递到消息队列,而后直接返回。成功返回非0值
WN_USER
三、控件、GDI
1、画笔、画刷
HPEN 画笔类型
创建画笔 CreatePen()函数
HBRUSH 画刷类型
创建画刷 CreateSolidBrush()函数
使用画笔或画刷的时候
调用 SelectObject()函数,必须有一个 图形设备描述表HDC
删除的时候用 DeleteObject()函数,讲某画笔填进去就好了
2、点
SetPixel()函数
3、线段
初始光标位置:
MoveToex()函数
画线段:
LineTo()函数
4、绘制矩形:
Rectangle()函数
FillRect()函数,绘制一个填充的矩形,包含左上角点,不包含右下角
FrameRect()函数,只是用画刷
Rectangle()函数,绘制一个实心填充的矩形
5、绘制圆
Ellipse()函数
6、多边形
Polygon()函数
2、定时器,计时器
首先创建一个计时器:
SetTimer()函数,窗口句柄,ID,毫秒
WM_TIMER 事件
其wparam 是某ID
当,定时器不用的时候,KillTimer()杀了他。放在关闭窗口哪里好了
GetTickCount()函数是获取开机到现在的时间
3、控件
略
4、获取信息
GetSystemInfo()功能特别强大
游戏过程:
#define WIN32_LEAN_AND_MEAN // just say no to MFC
#include <windows.h> // include important windows stuff
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#define WINDOW_CLASS_NAME "WINCLASS1"
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
HWND main_window_handle = NULL;
HINSTANCE hinstance_app = NULL;
char buffer[80];
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
char buffer[80];
switch(msg)
{
case WM_CREATE:
{
return(0);
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
default:break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
int Game_Main(void *parms = NULL, int num_parms = 0)
{
if (KEYDOWN(VK_ESCAPE))
SendMessage(main_window_handle,WM_CLOSE,0,0);
return(1);
}
int Game_Init(void *parms = NULL, int num_parms = 0)
{
return(1);
}
int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
return(1);
}
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
HDC hdc;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hinstance_app = hinstance;
if (!RegisterClassEx(&winclass))
return(0);
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"T3D Game Console Version 1.0",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,
400,300,
NULL,
NULL,
hinstance,
NULL)))
return(0);
main_window_handle = hwnd;
Game_Init();
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Game_Main();
}
Game_Shutdown();
return(msg.wParam);
}
本文详细介绍了Windows编程的基础知识,包括创建Windows窗体的过程:从创建窗口类到注册窗口类,再到创建窗口并处理消息循环。此外,还介绍了如何使用资源、处理事件及绘图等关键概念。
1488

被折叠的 条评论
为什么被折叠?



