windows程序设计代码
- 格式:doc
- 大小:41.00 KB
- 文档页数:7
⽤c语⾔编写⼀个windows窗⼝,Windows窗⼝创建代码(C语⾔)这是⼀个使⽤C语⾔创建空⽩窗⼝的基本框架代码案例。
#include#include//窗体备⽤HWND g_hwnd;HINSTANCE g_hInstance;//过程函数LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_DESTROY://销毁窗体PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}//主函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow){//定义填充窗⼝WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_VREDRAW | CS_HREDRAW;wcex.lpfnWndProc = WinProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wcex.lpszMenuName = NULL;wcex.lpszClassName = TEXT("WinApp");wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//注册窗⼝类if (!RegisterClassEx(&wcex)){return 0;}g_hInstance = hInstance;//创建窗⼝HWND hwnd;if (!(hwnd = CreateWindowEx(0, TEXT("WinApp"), TEXT("HelloWord"), WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL))){return 0;}g_hwnd = hwnd;//显⽰更新窗⼝ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}。
C++编写的Windows窗⼝Hello,World程序C++编写的Windows窗⼝Hello,World程序#include <windows.h>#include <tchar.h>/* 使类名成为全局变量 */TCHAR szClassName[ ] = TEXT("WindowsApp");/* 这个函数由Windows函数DispatchMessage()调⽤ */LRESULT CALLBACK WindowProcedure (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 World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hWnd, &ps) ;break ;case WM_DESTROY:PostQuitMessage (0);/* 发送WM_QUIT到消息队列 */break;default:/* 不想处理的消息 */return DefWindowProc (hWnd, message, wParam, lParam);}return0;}int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) {HWND hwnd;/* 窗⼝的句柄 */MSG messages;/* ⽤于储存应⽤程序的消息 */WNDCLASSEX wincl;/* 窗⼝类的数据结构 *//* 窗⼝结构 */wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;/* 被Windows调⽤的函数 */wincl.style = CS_DBLCLKS;/* 捕获双击事件 */wincl.cbSize = sizeof (WNDCLASSEX);/* 使⽤默认的图表和⿏标指针 */wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = NULL;/* 没有菜单 */wincl.cbClsExtra = 0;/* 窗⼝类后⾯没有额外的字节 */wincl.cbWndExtra = 0;/* 窗⼝实例化结构 *//* 使⽤Windows的默认颜⾊作为窗⼝的背景⾊ */wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;/* 注册窗⼝类,如果失败,退出程序 */if (!RegisterClassEx (&wincl))return0;/* 如果类被注册,创建窗⼝ */hwnd = CreateWindowEx (0,/* 扩展的变化信息 */szClassName,/* 类名 */"Hello World",/* 标题栏⽂本 */WS_OVERLAPPEDWINDOW,/* 默认窗⼝ */CW_USEDEFAULT,/* 使⽤默认的位置 */CW_USEDEFAULT,/* 使⽤默认的位置 */544,/* 窗⼝宽度(以像素点为单位) */375,/* 窗⼝⾼度(以像素点为单位) */HWND_DESKTOP,/* 此窗⼝是桌⾯的字窗⼝ */NULL,/* 没有菜单 */hThisInstance,/* 程序实例化句柄 */NULL/* 没有创建数据的窗⼝ */);/* 显⽰窗⼝ */ShowWindow (hwnd, nFunsterStil);/* 运⾏消息循环。
很多学C的朋友认为C语言只能写DOS程序,而不能像C#那样写windows窗体的程序,这你可就打错特错了,今天我来简单掩饰下C语言怎么利用windows提供出来的API写windows窗体程序。
开发工具VC6.0,开发平台windows7。
首先第一步,打开VC,新建工程,选择win32 application,如下图然后新建一个C语言源文件,这个就不截图了,如果这也不会的话相信你也不会来看这篇帖子~呵呵建好文件以后把一下代码输入进去。
编译即可~代码讲解会下帖子下方1.#include <windows.h>2.3.LRESULT CALLBACK Windo WP roc(4. HWND hwnd, //handle to window5. UINT uMsg, //message identifier6. WPARAM wParam, //first message parameter7. LPARAM lParam //second message parameter8. );9.10.11.int WINAPI WinMain(HINSTANCE hInstance,12. HINSTANCE hPrevInstance,13. L PS TR lpCmdLine,14. int nShowCmd15. )//入口函数16.{17. WNDCLASS wndclass;18. HWND wndhwnd;19. MSG msg;20. wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//加载图标21. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//加载鼠标样式22. wndclass.style=CS_VREDRAW | CS_HREDRAW;//窗口样式23. wndclass.lpfnWndProc=WindowProc;//窗口过程回调函数24. wndclass.cbClsExtra=0;//类额外内存25. wndclass.cbWndExtra=0;//窗口额外内存26. wndclass.hInstance=hInstance;//27. wndclass.hbrBackground=(HBRUSH)GetStockObject(SYSTEM_FONT);//窗口颜色28. wndclass.lpszMenuName=NULL;//窗口菜单29. wndclass.lpszClassName="testWindow";//窗口类名30.31. RegisterClass(&wndclass);32. wndhwnd=CreateWindow("testWindow","windows",WS_OVERLAPPEDWINDOW& ~WS_MAXIMIZEBOX,33. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,34. NULL,NULL,hInstance,NULL);35. ShowWindow(wndhwnd,SW_SHOWNORMAL);36. UpdateWindow(wndhwnd);37. while(GetMessage(&msg,NULL,0,0))38. {39. TranslateMessage(&msg);40. DispatchMessage(&msg);41. }42.43. return 0;44.}45.46.LRESULT CALLBACK WindowProc(47. HWND hwnd, //handle to window48. UINT uMsg, //message identifier49. WPARAM wParam, //first message parameter50. LPARAM lParam //second message parameter51. )52.{53. HDC hdc,hDC;54. PAINTSTRUCT ps;55. char szchar[20];56. static int i=0;57. switch (uMsg)58. {59. case WM_PAINT://窗口重绘消息,窗口加载和重绘的时候产生该消息60. hdc=BeginPaint(hwnd,&ps);61. TextOut(hdc,0,0,"窗口加载完成",strlen("窗口加载完成"));//往窗口输出文本62. //MessageBox(hwnd,"Hello World","Hi",MB_OK);63. EndPaint(hwnd,&ps);64.65. break;66. case WM_CHAR://处理键盘按键消息67. sprintf(szchar,"char is %c",wParam);68. MessageBox(hwnd,szchar,"提示",MB_OK);69. break;70. case WM_LBUTTONDOWN://处理鼠标左键按下消息71. MessageBox(hwnd,"mouse click","提示",MB_OK);72. hDC=GetDC(hwnd);73. TextOut(hDC,0,50,"鼠标事件处理时显示文字",strlen("鼠标事件处理时显示文字"));74. ReleaseDC(hwnd,hDC);75. break;76. case WM_CLOSE://窗口关闭消息77. if(IDYES==MessageBox(hwnd,"你确定要关闭吗?","提示",MB_YESNO))78. DestroyWindow(hwnd);79. break;80. case WM_DESTROY:81. PostQuitMessage(0);82. break;83. default:84. return DefWindowProc(hwnd,uMsg,wParam,lParam);//使用缺省值来调用窗口过程函数85. }86. return 0;87.}复制代码要说明的事,windows程序必须包含的头文件就是windows.h,而程序的入口函数叫做WinMain(dos的入口函数叫main),如果搞不清有几个参数,参数怎么写,可以查阅MSDN,WindowProc函数是窗口过程函数,也就是处理窗口消息的函数;先来看winamin函数内部,首先定义了一个WNDCLASS类型的数据,这个类型是windows 提供出来的结构体,他里面有10个成员。
目录实验一WINDOWS进程初识 (2)实验二进程管理 (6)实验三进程同步的经典算法 (10)实验四存储管理 (14)试验五文件系统试验 (18)实验有关(参考)代码实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。
(2)掌握WINDOWS API的使用方法。
(3)编写测试程序,理解用户态运行和核心态运行。
2、程序清单清单1-1 一个简单的Windows控制台应用程序// hello项目# include <iostream>void main(){std::cout << “Hello, Win32 Consol Application” << std :: endl ;}清单1-2 核心态运行和用户态运行时间比计算// proclist项目# include <windows.h># include <tlhelp32.h># include <iostream.h>// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORD GetKernelModePercentage(const FILETIME& ftKernel,const FILETIME& ftUser){// 将FILETIME结构转化为64位整数ULONGLONG qwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+ftKernel.dwLowDateTime;ULONGLONG qwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+ftUser.dwLowDateTime;// 将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONG qwTotal=qwKernel+qwUser;DWORD dwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);return(dwPct);}// 以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序void main(int argc,char *argv[]){if(argc<2){cout<<"请给出你要查询的程序名"<<endl;exit(0);}// 对当前系统中运行的过程拍取“快照”HANDLE hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,// 提取当前过程0);// 如果是当前过程,就将其忽略// 初始化过程入口PROCESSENTRY32 pe;::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);BOOL bMore=::Process32First(hSnapshot,&pe);BOOL found = FALSE;while(bMore){// 打开用于读取的过程if(!strcmp(pe.szExeFile,argv[1])){found = TRUE;HANDLE hProcess=::OpenProcess(PROCESS_QUERY_INFORMA TION,// 指明要得到信息FALSE,// 不必继承这一句柄pe.th32ProcessID);// 要打开的进程if (hProcess!=NULL){// 找出进程的时间FILETIME ftCreation,ftKernelMode,ftUserMode,ftExit;::GetProcessTimes(hProcess,// 所感兴趣的进程&ftCreation,// 进程的启动时间&ftExit,// 结束时间(如果有的话)&ftKernelMode,// 在内核模式下消耗的时间&ftUserMode);// 在用户模式下消耗的时间// 计算内核模式消耗的时间百分比DWORD dwPctKernel=::GetKernelModePercentage(ftKernelMode,// 在内核模式上消耗的时间ftUserMode);// 在用户模式下消耗的时间// 向用户显示进程的某些信息cout<< "process ID: " << pe.th32ProcessID<< ",EXE file:" << pe.szExeFile<< ",%d in Kernel mode: " << dwPctKernel << endl;// 消除句柄::CloseHandle(hProcess);}}// 转向下一个进程bMore=::Process32Next(hSnapshot,&pe);}if(found==FALSE){cout<<"当前系统没有这个可执行程序正在运行"<<endl;exit(0);}}清单1-3 核心态运行和用户态运行时间测试程序#include <stdio.h>main(){int i,j;while(1){for(i=0;i<1000;i++);for(j=1;j<1000;j++) printf(“enter kernel mode running.”);}}实验二进程管理1、实验目的1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
#include <windows.h>#include "resource.h"#include "afxres.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//窗口函数TCHAR szAppName[] = TEXT ("PaintPicture") ; // 菜单名bool isCircle;bool isMove;int x1,x2,y1,y2;static int iCount;static int i,j;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){HWND hwnd ;MSG msg ;WNDCLASS wndclass ;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 = szAppName ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox ( NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow ( szAppName, TEXT ("PaintPicture"),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){static int idColor[5]={WHITE_BRUSH,LTGRAY_BRUSH,GRAY_BRUSH,DKGRAY_BRUSH,BLACK_BRUSH};//存放五种颜色的画刷static int iSelection=IDM_BKGND_WHITE;//存放背景子菜单的IDstatic int cxClient,cyClient;static long crClour;HBRUSH hBrush;HDC hdc;PAINTSTRUCT ps;//保存绘图信息的结构HMENU hMenu;//菜单代号switch(message){case WM_SIZE://求出客户区的大小cxClient=LOWORD(lParam);cyClient=HIWORD(lParam);return 0;case WM_COMMAND:hMenu=GetMenu(hwnd);//把.rc文件中的菜单模版定义的菜单结构载入内存//取得指向菜单结构的代号switch(LOWORD(wParam)){ case IDM_PAINT_ROUND://画图菜单圆形菜单项case IDM_ROUND_DRAW://画圆x1=20;y1=20;x2=60;y2=60;isCircle=1;i=0;InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_ROUND_MOVE://移动圆形iCount=1;return 0;case IDM_ROUND_UNMOVE://停止移动iCount=0;return 0;case IDM_ROUND_ENLARGE://放大圆形x2+=40;y2+=40;isCircle=1;i++;InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_ROUND_REDUCE://缩小圆形x2-=40;y2-=40;isCircle=1;InvalidateRect(hwnd,NULL,TRUE);i--;return 0;case IDM_PAINT_RECTANGLE://矩形菜单项case IDM_RECTANGLE_DRAW://画矩形x1=20;y1=40;x2=60;y2=70;isCircle=0;iCount=0;j=0;InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_RECTANGLE_MOVE://移动矩形iCount=1;return 0;case IDM_RECTANGLE_UNMOVE://停止移动矩形iCount=0;return 0;case IDM_RECTANGLE_ENLARGE://放大矩形x2+=40;y2+=30;isCircle=0;j++;InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_RECTANGLE_REDUCE://缩小矩形x2-=40;y2-=30;isCircle=0;j--;InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_BKGND_WHITE://背景颜色case IDM_BKGND_LTGRAY:case IDM_BKGND_GRAY:case IDM_BKGND_DKGRAY:case IDM_BKGND_BLACK:CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);//把上面菜单项中已有的选中标记取消iSelection=LOWORD(wParam);//上面菜单项中新选择的ID送iselection CheckMenuItem(hMenu,iSelection,MF_CHECKED);//在选择菜单项旁边作新的标记SetClassLong(hwnd,GCL_HBRBACKGROUND, (LONG)GetStockObject(idColor[LOWORD(wParam)-IDM_BKGND_WHI TE]));/*把窗口类中的画刷换成新的画刷,办法是根据菜单项ID把idColor中的新画刷放到窗口类中*/InvalidateRect(hwnd,NULL,TRUE);return 0;case IDM_COLOUR_RED:crClour=RGB(255,0,0);return 0;case IDM_COLOUR_GREEN:crClour=RGB(0,255,0);return 0;case IDM_COLOUR_BLUE:crClour=RGB(0,0,255);return 0;case IDM_APP_EXIT:SendMessage(hwnd,WM_CLOSE,0,0);return 0;case IDM_APP_HELP:MessageBox(hwnd,TEXT("Help not yet implemented!"),szAppName,MB_ICONEXCLAMATION|MB_OK);return 0;case IDM_APP_ABOUT:MessageBox(hwnd,TEXT("Menu Demonstration Program\n")TEXT("(C)charlesPetzold,2009"),szAppName,MB_ICONINFORMATION|MB_OK);return 0;}case WM_PAINT:hdc=BeginPaint(hwnd,&ps); //确定重画区hBrush=CreateSolidBrush(crClour);//定义画刷SelectObject(hdc,hBrush);if(isCircle==1)Ellipse(hdc,x1,y1,x2,y2);//画圆形elseRectangle(hdc,x1,y1,x2,y2);//画矩形EndPaint(hwnd,&ps);//释放重画区return 0;case WM_LBUTTONDOWN:if(iCount==1&&isCircle==0){ x1=LOWORD(lParam);y1=HIWORD(lParam);x2=40*(j+1)+x1;y2=30*(j+1)+y1;}else if(iCount==1&&isCircle==1){ x1=LOWORD(lParam);y1=HIWORD(lParam);x2=40*(i+1)+x1;y2=40*(i+1)+y1;}InvalidateRect(hwnd,NULL,TRUE);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}。