关闭

C语言API编写窗体界面和按钮

标签: C语言窗体界面按钮CreateWindow函数API
5767人阅读 评论(4) 收藏 举报
分类:
        最近有个同学的程序需要用对话框的方式实现,但前面都是通过黑框形式完成的,老师突然让增加一个界面,本来准备采用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/)

4
1
查看评论

c语言编写登录界面

#include<stdio.h> #pragma warning(disable:4996) #include<string.h> int main() { int i = 0; char password[10] = { 0 }; printf(&...
  • xiaobingRSQ
  • xiaobingRSQ
  • 2016-11-03 22:36
  • 4515

C语言调用WindowsAPI函数获取计算机名称

源程序为:#include#includevoid main(){ char a[255];        unsigned long size=255; GetComputerName(a,&size);    printf(&q...
  • huluputi
  • huluputi
  • 2009-12-18 22:56
  • 2293

C语言与Windows API编程!有无同路人?

我始终认为自己C语言学得不错,虽然没有什么产品。曾经有一段相当长的时间我也认为C语言在现代开发中已经没有了市场,但是自从接触到了一本电子书《Programming Windows》后我发现,C在现代的Windows窗口图形化开发方面仍然可以。可惜的是,这本书是1998年附近出版的,讲述的内容虽然也包...
  • 54ybj
  • 54ybj
  • 2005-06-07 11:46
  • 2459

纯C语言写计算器界面

纯C语言写计算器界面,GDI绘制控件,HOOK拦截键盘按键。 主文件源码预览: // Calculator.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Calculator.h" #inclu...
  • goosdy
  • goosdy
  • 2013-04-04 21:40
  • 3173

C写windows窗体,(我原来一直以为C不能写gui界面,原来是我太菜了)

#include "windows.h"char szClassName[] = {"First Window"};HWND hParent;// LRESULT 类型是一个32位值,指的是从窗口过程或者回调函数返回的32位值 。 CALLBACK指定此函数为...
  • xianghao110
  • xianghao110
  • 2010-03-17 10:08
  • 2484

用C语言编写的图形界面简单程序

  • 2016-03-02 13:12
  • 1KB
  • 下载

用c语言创建一个窗口

用c语言创建一个窗口,环境为vs2010
  • newer_no1
  • newer_no1
  • 2017-12-04 01:23
  • 326

终于能用C语言整个Windows窗体出来了

  • weapon578786647
  • weapon578786647
  • 2010-02-22 12:29
  • 3610

用c语言创建windows窗口

耐得住寂寞,禁得起诱惑,这就是程序人生 步骤: 1.在WinMain中定义各种变量 2.注册窗口类RegisterClass 3.创建窗口CreateWindow 4.显示窗口和更新窗口 ShowWindow (hwnd, iCmdShow) ;   ...
  • booirror
  • booirror
  • 2012-07-02 00:38
  • 8735

C语言调用windows关机对话框

<br /> 具体代码如下:<br />/* * 调用关闭系统的对话框 * write by:只爱阿蒙 e_mail:youyong407@163.com */ #include <windows.h> #include "re...
  • youyong407
  • youyong407
  • 2011-01-22 12:33
  • 432
    个人资料
    • 访问:2326231次
    • 积分:21610
    • 等级:
    • 排名:第413名
    • 原创:270篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1651条
    个人博客
    作者:杨秀璋
    学历:本科-北京理工大学
               硕士-北京理工大学
    现任教于贵财财经大学信息学院
    http://www.eastmountyxz.com

    简介:自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。

    贵州纵美路迢迢,
    为负劳心此一遭。
    收得破书三四本,
    也堪将去教尔曹。

    娜美人生,醉美生活。
    他和她经历风雨,慢慢变老。
    博客专栏
    牛人博客
    最新评论