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 ;       //结构体后附加的字节数,一般总为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];   //按钮句柄

     switch (message)
     {
	 case WM_CREATE: //创建按钮
		 {
			hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
			//按钮1
			hwndButton[0] = CreateWindow("BUTTON","训练",
				WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
				10,10,100,100,hwnd,NULL,
				(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
			//按钮2
			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: //响应按钮消息
		 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/)

时间: 2024-08-30 18:01:00

C语言API编写窗体界面和按钮的相关文章

VC实现给窗体的一个按钮添加事件的方法_C 语言

本文实例讲述了VC实现给窗体的一个按钮添加事件的方法.分享给大家供大家参考.具体实现方法如下: 1. 在MainFrm.h中 复制代码 代码如下: // Generated message map functions 添加: 复制代码 代码如下: afx_msg void OnSelectRed(); //声明事件名称 2. MainFrm.cpp中 复制代码 代码如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)下面 添加: 复制代码 代码如下: ON_C

C语言控制台窗口图形界面编程之一

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输

C语言+win32api写窗体应用程序_C 语言

昨晚看了一下win32api编程的知识,我在网上搜索了许多教程,一个美化版的windows编程,代码错漏百出,缺字,翻译难懂生硬,术语不专业,一个windows.c编程,模糊,而且用的是VC++6.0,由于我的电脑装不上vc++6.0,只能用vs2008,许多操作和函数都不太一样了.在网上找到一篇博客园的win32api编程的文章,照抄下来,结果编译下来几十个错误--晕死了. 后来还是参照以下四个步骤,自己查MSDN用C语言写出来了,晕死,英文不好,话说,金山词霸对MSDN的整句翻译很专业啊.

Mysql C语言API编程入门讲解之详细篇

软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能. Mysql C语言API就是用C语言编写的Mysql编程接口,使用这些接口函数可以实现对Mysql数据库的查询等操作. Mysql的安装 要进行Mysql编程首先要在充当Mysql服务器的电脑和

阻塞-vb.net多线程造成窗体界面“假死”解决办法?

问题描述 vb.net多线程造成窗体界面"假死"解决办法? 我在一个窗体按钮单击事件里开了一个新线程用于连接一硬件设备,结果线程一start窗体就卡死了,造成窗体线程阻塞,我想知道时间片是如何分配的,默认优先级相同,为什新线程会独占时间片? 解决方案 我在编写MFC窗体程序时也测验过线程独占的情形,我猜想最可能的原因是:线程的开辟与管辖范围与主线程相干.

api-百度地图API编写一个起点到终点的

问题描述 百度地图API编写一个起点到终点的 <br> body, html{width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}<br> #allmap{height:500px;width:100%;}<br> #r-result{width:100%; font-size:14px;}<br> 城市名定位 城市名: // 百度地图API功能 var map = new BMap

Mysql C语言API编程入门讲解

原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.  API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能.  Mysql C语言API就是用C语言编写的Mysql编程接口,使用这些接口函数可以实现对Mysql数据库的查询等操作.  Mysql的安装  要进

着急-这些sql语言对应的C#语言怎么编写?

问题描述 这些sql语言对应的C#语言怎么编写? //-------------------------------//考卷内容表drop table examcontent;create table ExamContent( Pid number(40) not null Tid number(40) null Type number(40) null Source number(10) null Answer varchar2(4000) null FullMark number(31) n

MySQL的C语言API接口_C 语言

1.首先当然是连接数据库,函数原型如下: MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); 第一个参数 MYSQL是 C api中一个非常重要的变量,里面内存非常丰富