zoukankan      html  css  js  c++  java
  • C语言API编写窗口界面和button

            近期有个同学的程序须要用对话框的方式实现,但前面都是通过黑框形式完毕的,老师突然让添加一个界面,本来准备採用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/)

  • 相关阅读:
    590. N-ary Tree Postorder Traversal
    C++——指针3
    C++——指针2-指向数组的指针和指针数组
    C++——指针1
    C++——二维数组和对象数组
    C++——一维数组
    C++——程序的结构
    C++——类与对象
    C++——函数
    C++——简单程序设计
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5074060.html
Copyright © 2011-2022 走看看