导航:首页 > 编程语言 > windowsapi编程实例

windowsapi编程实例

发布时间:2023-06-02 22:53:40

❶ windows编程基础 利用WIN32API编写WinMain函数,完成窗口类的注册,窗口的创建,显示,更新,并完成消息循

///////////////////////////////////////////////////////////////
// 04FirstWindow.cpp文件
#include <stdio.h>

#include "stdafx.h"

// 窗口函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;

// 用描述主窗口的参数填充WNDCLASSEX结构
wndclass.cbSize = sizeof(wndclass); // 结构的大小
wndclass.style = CS_HREDRAW|CS_VREDRAW; // 指定如果大小改变就重画
wndclass.lpfnWndProc = MainWndProc; // 窗口函数指针
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 = szClassName ; // 窗口类的名称
wndclass.hIconSm = NULL; // 没有类的小图标

// 注册这个窗口类
::RegisterClassEx(&wndclass);

// 创建主窗口
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,扩展样式
szClassName, // lpClassName,类名
"My first Window!", // lpWindowName,标题
WS_OVERLAPPEDWINDOW, // dwStyle,窗口风格
CW_USEDEFAULT, // X,初始 X 坐标
CW_USEDEFAULT, // Y,初始 Y 坐标
CW_USEDEFAULT, // nWidth,宽度
CW_USEDEFAULT, // nHeight,高度
NULL, // hWndParent,父窗口句柄
NULL, // hMenu,菜单句柄
hInstance, // hlnstance,程序实例句柄
NULL) ; // lpParam,用户数据

if(hwnd == NULL)
{
::MessageBox(NULL, "创建窗口出错!", "error", MB_OK);
return -1;
}

// 显示窗口,刷新窗口客户区
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);

// 从消息堆中取出消息
MSG msg;
while(::GetMessage(&msg,NULL, 0, 0))
{
// 转化键盘消息
::TranslateMessage(&msg);
// 将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}

// 当GetMessage返回0时程序结束
return msg.wParam;
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char szText[] = "最简单的窗口程序!";
switch (message)
{
case WM_PAINT: // 窗口客户区需要重画
{
HDC hdc;
PAINTSTRUCT ps;

// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hwnd, &ps) ;
// 显示文字
::TextOut(hdc, 10, 10, szText, strlen(szText));
::EndPaint(hwnd, &ps);
return 0;
}
case WM_CHAR:
{
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"Windows",MB_OK);
break;
}
case WM_LBUTTONDOWN:
{
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"Windows program",strlen("Windows program"));
ReleaseDC(hwnd,hdc);
break;
}
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否退出程序?","Windows",MB_YESNO))
{
DestroyWindow(hwnd);
}
case WM_DESTROY: // 正在销毁窗口

// 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
::PostQuitMessage(0) ;
return 0 ;
}

// 将我们不处理的消息交给系统做默认处理
return ::DefWindowProc(hwnd, message, wParam, lParam);
}

❷ 最简单的Windows API编程 求解

知其然要知其所以然。不管你是直接C++ source file, 还是 win32 Application,只要你了解其本质,那么你可以通过简单的配置,使你的程序成功运行起来。下面我告诉你如何在命令提示符(cmd.exe 或 command prompt)下编译你的程序。
1.如何进入初始化编译器环境的命令提示符:
1)如果还是使用VC++6.0。那么在开始->运行中输入cmd, 然后回车。在cmd.exe中使用cd命令进入你的VC++6.0安装目录的VC目录下,应该可以找到vcvars32.bat, 然后在cmd.exe运行vcvars32.bat批处理脚步就可以了。
2)如果是VS 2005 2008 2010 2012,那么在开始中找到对应目录,在这个目录下有个开发工具目录,里面有个vs x32 command prompt, 直接点击就可以了。

2.如何在以上命令提示符中编译你的程序,假设你上面的程序文件为test.c:
cl /? #查看编译器使用帮助

cl /OUT:test.exe kernel32.lib user32.lib gdi32.lib /SUBSYSTEM:WINDOWS /ENTRY:WinMainStartup /MANIFEST:NO /MD test.c

这样可以成功编译出来的text.exe

Tip: 问题的关键是/SUBSYSTEM和/ENTRY

/SUBSYSTEM: [CONSOLES, WINDOWS, ...] 这是主要的两个参数。

/ENTRY: [WinMainStartup, mainCRTStartup] 就这两个参数。(WinMainStartup可能是WinMainCRTStartup,我记不清了)

问题关联:

1.当你直接C++ source file时,/SUBSYSTEM:CONSOLES /ENTRY:mainCRTStartup (这时入口函数时main,<report LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main >, 它说crt0.obj使用了一个叫main的函数,你却没有写...)

2.当你使用win32 application时,/SUBSYSTEM:WINDOWS /ENTRY:WinMainCRTStartup (这时你的程序符合要求,因为它找到了WinMain函数)

拓展:
#include<windows.h>
#pragma comment(lib,"User32.lib")
int main(int argc, char *argv[])
{
MessageBox(NULL,TEXT("开始学习"),TEXT("消息对话框"),MB_OK);
return 0;
}
把WinMain改成标准C/C++的main之后如何运行程序,因为你使用MessageBox函数,使用了win32 API, 故/SUBSYSTEM:WINDOWS。又因为你使用main函数为程序入口函数,故/ENTRY:mainCTRStartup。编译命令如下:

cl /OUT:test.exe kernel32.lib user32.lib gdi32.lib /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup /MANIFEST:NO /MD test.c

Note: 以上参数都可以在VC++开发环境工程设置里面进行更改设置,由于我是在Unix下工作,很久没有接触VC,以上参数可能存在偏差,请使用cl /? link /? res /? nmake /?等自行仔细查看。另外,我建议开始编程使用命令加脚本的方式编程,学会使用自己编写Makefile, 因为VC++的图形开发环境本质就是建立在各种脚本之上,所以对排查程序错误能够有本质上的认识。

阅读全文

与windowsapi编程实例相关的资料

热点内容
军用压缩饼干和军粮 浏览:595
韩国成人百合电影 浏览:271
戴拿奥特曼客串过的电影 浏览:403
学金融工资高还是学程序员 浏览:528
有一个外国电影大家躲在超市里 浏览:134
60分钟在线观看 浏览:680
营销系统源码有哪些 浏览:543
图片导航网站源码 浏览:737
linux开启终端 浏览:663
日本爱 浏览:818
云服务器如何运行项目 浏览:487
韩剧一个女主叫美娜善喜 浏览:565
降低php版本 浏览:58
成年二次元下载 浏览:50
设计加密文件 浏览:181
韩国电影观看网站大全 浏览:479
云服务器云计算 浏览:226
欧式古典牛奶电影 浏览:350
女主不断变美的系统文 浏览:390