C语言API编写窗体界面和按钮
最近有个同学的程序需要用对话框的方式实现,但前面都是通过黑框形式完成的,老师突然让增加一个界面,本来准备采用MFC完成的,但后来一想,该程序核心东西是体现在它的算法上,控制台的程序并非不好.转念一想,如果使用MFC这样的方法好像需要再倒腾一遍,想到了大一在"C语言能干大事"中的东西,所以就准备采用这种形式直接完成,投机取巧的方法.
主要是通过调用Windows API界面的CreateWindows函数完成,同时也能创建按钮,把参数设置为button,如果想响应该按钮,只需在回调函数中增加消息WM_COMMAND判断即可.代码如下:
#include<windows.h>
#include<stdio.h>//声明回调函数
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//主函数 程序入口
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND hwnd ; //用来保存成功创建窗口后返回的句柄MSG msg ; //定义消息结构体变量WNDCLASS wndclass ; //窗体类wndclass.style = CS_HREDRAW | CS_VREDRAW ; //指定窗口风格wndclass.lpfnWndProc = WndProc ; 函数指针,指向处理窗口消息的函数入口wndclass.cbClsExtra = 0 ; //结构体后附加的字节数,一般总为0wndclass.cbWndExtra = 0 ; //窗体实例附加的字节数,一般总为0wndclass.hInstance = hInstance ; //模块句柄wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标句柄 任务栏显示的图标wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标句柄wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色COLOR_BACKGROUNDwndclass.lpszMenuName = NULL ; //菜单名的字符串wndclass.lpszClassName = szAppName ; //自定义类名,不要与其他类名重复if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("注册类失败!"), szAppName, MB_ICONERROR) ;return 0 ;}int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中//创建窗体APIhwnd = CreateWindow(szAppName,TEXT("毕业设计"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);//显示窗体的API 传入需要显示的窗体句柄和显示方式ShowWindow(hwnd,iCmdShow);//刷新窗体的APIUpdateWindow(hwnd);//从系统的应用程序线程消息队列中取得一个消息while(GetMessage(&msg,NULL,0,0) > 0){DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc; //句柄PAINTSTRUCT ps;RECT rect; //矩形HINSTANCE hInstance; //窗口实例static HWND hwndButton[2]; //按钮句柄switch (message){ case WM_CREATE: //创建按钮{hInstance = ((LPCREATESTRUCT)lParam)->hInstance;//按钮1hwndButton[0] = CreateWindow("BUTTON","训练", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,10,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//按钮2hwndButton[1] = CreateWindow("BUTTON","获取", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,250,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);return 0;}case WM_PAINT: //绘制文字hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("By:Eastmount CSDN制作"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return 0;case WM_COMMAND: //响应按钮消息if((HWND)lParam == hwndButton[0]){MessageBox(NULL,TEXT("是否训练图片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);}if((HWND)lParam == hwndButton[1]){MessageBox(NULL,TEXT("是否获取图片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);}return 0;case WM_CLOSE: //关闭if(IDYES==MessageBox(hwnd,"是否关闭程序?","提示",MB_YESNO|MB_ICONQUESTION)){DestroyWindow (hwnd); }return 0;case WM_DESTROY: //退出程序PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}
程序运行结果如下图所示:
其中主要涉及到的函数原型如下所示:
//创建窗体
hwnd = CreateWindow (szClassName, /* Classname */"Windows App", /* Title Text */WS_OVERLAPPEDWINDOW, /* default window */CW_USEDEFAULT, /* Windows decides the position */CW_USEDEFAULT, /* where the window ends up on the screen */544, /* The programs width */375, /* and height in pixels */HWND_DESKTOP, /* The window is a child-window to desktop */NULL, /* No menu */hThisInstance, /* Program Instance handler */NULL /* No Window Creation data */
);
//创建按钮
hwndButton = CreateWindow( "BUTTON", // predefined class "OK", // button text WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles 10, // starting x position 10, // starting y position 100, // button width 100, // button height hwnd, // parent window NULL, // No menu (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL // pointer not needed
);
最后,写这篇文章主要是怀念自己大一时的生活,从一个什么都不知道的孩子,通过学习C语言,C语言能干大事开始接触编程.同时,我认为这个程序也是非常还的入门程序,希望刚接触程序的同学也可以看看,编编自己感兴趣的程序、写写博客、AC题目、编写游戏、聊天软件、移动开发,能从程序和生活中找到一些让自己心灵美妙的东西.
(By:Eastmount 2014-5-25 夜2点半 原创CSDNhttp://blog.csdn.net/eastmount/)
C语言API编写窗体界面和按钮相关推荐
- linux下的c语言实现象棋,用c语言+API制作象棋界面
现在已经把所有的棋子放到上面了,运行即可看到象棋的开局画面,而且已经实现走子了.新手注意:注意不能直接复制代码,那样有行号,鼠标移动到代码上方就有复制按钮了. //本程序的目的是用c语言+API制作象 ...
- c语言图形界面设定,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- c语言界面怎么加图形,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- C语言如何编写游戏界面,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- C语言中图形方式界面怎么,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- 能用c语言编写图形界面吗,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- c语言可以编写图形界面吗,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- c语言 显示 图形界面,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
- c语言怎么让图形界面单独显示,「分享」C语言如何编写图形界面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...
最新文章
- 进阶学习(3.4) Builder Pattern 建造者模式
- Python中关于‘self’的种种用法笔记
- 216. 组合总和 III017(回溯法求解)
- mysql timestamp 并发_MySQL 实现 EF Code First TimeStamp/RowVersion 并发控制
- 深度学习数据自动编码器_如何学习数据科学编码
- java 父子线程 调用链_ZipKin原理学习--Zipkin多线程及线程池中追踪一致性问题解决...
- 吴恩达机器学习(十二)主成分分析(降维、PCA)
- Effective Objective-C 2.0 Tips 总结 Chapter 3 Chapter 4
- iframe跨域与session失效问题
- linux 设备驱动之8250串口驱动分析
- 攻击者利用7号信令(SS7)中的漏洞从德国银行偷取钱财
- java WinRM 远程连接 windows10 执行脚本
- 安装智能陈桥五笔时请小心
- 中国眼部护理产品市场趋势报告、技术动态创新及市场预测
- 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)
- 2030年的人工智能与生活(AI and Life in 2030)
- 大教堂与集市读书笔记
- VPC5021电流模式 PWM 控制器 3uA 超低启动电流
- AXURE原型:AI翻译平台
- FPS游戏自动瞄准敌人头部?是如何实现的(三)准星算法与实现自动瞄准
热门文章
- ORACLE TEXT LEXER PREFERENCE(一)
- 从产品与程序员打架事件,谈谈需求管理的沟通能力
- thinkphp的使用——隐藏index.php
- socket.io c++库编译不成功的注意事项
- WebStorm For Mac下载及破解方法
- HTML CSS简介与图片映射
- HTML5 required是必填
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
- access 导入 txt sql语句_access将SQL语句从查询复制到VBA
- oracle带输出参数存储,oracle带输入输出参数存储过程(包括sql分页功能)