近期有个同学的程序须要用对话框的方式实现,但前面都是通过黑框形式完毕的,老师突然让添加一个界面,本来准备採用MFC完毕的,但后来一想,该程序核心东西是体如今它的算法上,控制台的程序并不是不好.转念一想,假设使用MFC这个方案好像须要再倒腾一遍,想到了大一在"C语言能干大事"中的东西,所以就准备採用这种形式直接完毕,投机取巧的方法.

        主要是通过调用Windows API界面的CreateWindows函数完毕,同一时候也能创建button,把參数设置为button,假设想响应该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 ; //结构体后附加的字节数,一般总为0
wndclass.cbWndExtra = 0 ; //窗口实例附加的字节数,一般总为0
wndclass.hInstance = hInstance ; //模块句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标句柄 任务栏显示的图标
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标句柄
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色COLOR_BACKGROUND
wndclass.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居中 //创建窗口API
hwnd = CreateWindow(szAppName,TEXT("毕业设计"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);
//显示窗口的API 传入须要显示的窗口句柄和显示方式
ShowWindow(hwnd,iCmdShow);
//刷新窗口的API
UpdateWindow(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]; //button句柄 switch (message)
{
case WM_CREATE: //创建button
{
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
//button1
hwndButton[0] = CreateWindow("BUTTON","训练",
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10,10,100,100,hwnd,NULL,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
//button2
hwndButton[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: //响应button消息
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编写窗口界面和button的更多相关文章

  1. 使用java语言编写窗口按钮

    使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...

  2. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

  3. HTML5+规范:Webview(管理应用窗口界面)

    一.知识点 Webview模块管理应用窗口界面,实现多窗口的逻辑控制管理操作.通过plus.webview可获取应用界面管理对象. 1.方法 1.1.all: 获取所有Webview窗口 Array[ ...

  4. 分享在winform下实现左右布局多窗口界面

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口 ...

  5. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  6. RESTful API 编写指南

    基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的 ...

  7. atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

    atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参 ...

  8. 在winform下实现左右布局多窗口界面的方法(一)

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,通过本文给大家介绍在winform下实现左右布局多窗口 ...

  9. Android学习——利用RecyclerView编写聊天界面

    1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...

随机推荐

  1. android 图片浏览器 demo

    先上效果图,本demo 会逐步完好 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTczMDE2NjEz/font/5a6L5L2T/fontsi ...

  2. 用JavaScript实现网页动态水印

    1.基本原理 页面加载后,通过javascript创建页面元素div,并在div元素中创建文本节点,展示水印内容 设置div元素样式,将其zIndex设置一个较高的值,并设置透明度,实现浮在页面的水印 ...

  3. java线程例子登山

    Through its implementation, this project will familiarize you with the creation and execution of thr ...

  4. 给节点设置tag【从零開始cocos3.0final 】

    在cocos中通过tag来管理节点是非经常常使用的:以下介绍一个关于在cocos中使用tag的实例: typedef enum{ tag1 }Tag; 这里能够使用枚举类型,来为多个节点设置tag: ...

  5. WPF 3D:MeshGeometry3D的定义和光照

    原文 WPF 3D:MeshGeometry3D的定义和光照 由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果.让我们用不同的定义Mesh的方法来演示 ...

  6. 【Java基础】异常的简单分类与处理

    Java中所有的异常都继承自Throwable类,Throwable类的已知子类有Error和Exception. Error是指系统出现的错误,这种错误出现的时候,我们的程序无能为力,所以不需要进行 ...

  7. MVC Controller向View传值(ViewData与ViewBag)

    近期在开发项目中,使用的是ASP.NET MVC因为之前并没有接触,对于它的传值方式有些陌生,在这里进行初步总结积累学习. 一:使用 ViewData使用: public ActionResult I ...

  8. WCF-001:WCF的发布

    随着“云”时代的到来,“云”已经无处不在了.什么是“云”,无非就是利用互联网强大的功能建立多个服务器,然后再利用互联网的传输数据的特点将数据从某个服务器中读取出来或者将你的数据上传上去.当然这个服务器 ...

  9. aspx向silverlight传值

    原文:http://www.cnblogs.com/lensso/archive/2010/07/27/1785844.html 方法1: 向嵌入aspx页面的silverlight对象添加imnit ...

  10. java.io.FileNotFoundException: /home/hadoop/hadoop/dfs/namenode/current/VERSION (Permission denied)

    今天布置hadoop集群,尝试单独将secondarynamenode分属到一台独立的虚拟机上, 当格式化后,start-dfs.sh.namenode没启动.查看日志.报错例如以下 查看权限才发现, ...