C语言实现SDK窗口编程

//---------------------------------------------------------------------------
#include <windows.h>
//===========================================================================
long __stdcall WndProc(HWND hwnd,UINT msg,WPARAM WParam,LPARAM LParam)  
{  
    switch(msg)  
    {  
        case WM_CLOSE:  
            PostQuitMessage(0);  
            break;  
        case WM_LBUTTONDOWN:  
            MessageBoxA(0,"ok","提示",0);  
            PostQuitMessage(0);  
            break;  
        case WM_PAINT:  
        {  
            HDC hdc;  
            hdc = GetDC(hwnd);  
  
            RECT rect;  
            GetClientRect(hwnd,&rect);  
              
            rect.left   = rect.right/2;  
            rect.top    = rect.bottom/2;  
            rect.right  = rect.left+50;  
            rect.bottom = rect.top+30;  
  
            DrawText(hdc,"hello",5,&rect,0);  
  
            ReleaseDC(NULL,hdc);  
        }  
        default:  
            return DefWindowProc(hwnd,msg,WParam,LParam);  
    }  
  
    return 0;  
}  

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreHinstance, LPSTR, int)
{
     g_hIns = hInstance;
     WNDCLASS theClass ={0};
     char * lpszClassName = "myClass";
     char * lpszTitle     = "测试窗口";
     HWND hwnd;
     MSG  msg;

     theClass.style       = 0;//缺省窗口风格
     theClass.lpfnWndProc = WndProc;
     theClass.cbClsExtra  = 0;//窗口类无扩展
     theClass.cbWndExtra  = 0;//窗口实例无扩展

     theClass.hInstance =  hInstance;

     //窗口的最小化图标为缺省图标,即窗口左上角图标
     //VC中资源ID为IDI_APPLICATION
     //在BCB中资源名为MAINICON
     theClass.hIcon=LoadIcon(hInstance,"MAINICON");

     theClass.hCursor=LoadCursor(NULL,IDC_ARROW);                  //窗口采用箭头光标
     theClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色
     theClass.lpszMenuName=NULL;             //窗口无菜单
     theClass.lpszClassName=  lpszClassName; //窗口类名为"窗口"

     if(!RegisterClass(&theClass)) //如果注册失败 发出警告
     {
          MessageBeep(0);
          return FALSE;
     }

     hwnd=CreateWindow( lpszClassName, //窗口类名
      lpszTitle,           //窗口标题名
      WS_OVERLAPPEDWINDOW, //窗口的风格
      CW_USEDEFAULT,       //窗口左上角坐标值为缺省值
      CW_USEDEFAULT, 
      500, 300,            //窗口的宽和高
      NULL,                //此窗口无父窗口
      NULL,                //此窗口无子菜单
      hInstance,           //创建此窗口的应用程序的当前句柄
      NULL                 //不使用该值
      );

     ShowWindow(hwnd,SW_SHOW);
     UpdateWindow(hwnd);

     while(true)
     {
         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
         {
           if (msg.message == WM_QUIT)
               break;

           TranslateMessage(&msg);
           DispatchMessage(&msg);

         }

//         if (GetMessage (&msg, NULL, 0, 0))
//         {
//               TranslateMessage (&msg) ;
//               DispatchMessage (&msg) ;
//         }
//         else
//           break;
     }
     
     return msg.wParam; //消息循环结束 即程序结束时 将信息返回系统
}

PeekMessage与GetMessage函数处理不相同,两种方式都可以.PeekMessage是不阻塞的,GetMessage是线程阻塞的,内部处理退出消息,所以不用判断退出消息,关闭时,就跳到break结束循环。要在WM_PAINT消息中绘图,可用如下代码:

PAINTSTRUCT ps ={0};  
HDC hdc = BeginPaint(hwnd,&ps);  
  
//HPEN hPen = GetStockObject(WHITE_PEN);  
HPEN hPen = CreatePen(PS_DASHDOTDOT,1,RGB(255 , 0 , 0 ));  
HGDIOBJ oldPen = (HGDIOBJ)SelectObject(hdc,hPen);  
if(!oldPen)  
{  
    int err = GetLastError();  
    char buff[20]={0};  
    itoa(err,buff,10);  
    OutputDebugStringA(buff);  
}  
//画矩形  
Rectangle(hdc,20,30,80,120);  
//画线  
MoveToEx ( hdc , 20 , 10 , NULL );  
LineTo( hdc , 200 ,100);  
  
SelectObject(hdc, oldPen);  
  
  
DeleteObject(hPen);  
EndPaint(hwnd,&ps);
时间: 2024-11-05 14:49:57

C语言实现SDK窗口编程的相关文章

c语言之良好的编程习惯(二)

1.在使用变量时应该遵循一下良好的编程习惯. <1>定义有意义的变量名,有助于程序自成文档,可以减少注释. <2>用作变量名的标识符,第一个字母应该小写.大写字母开头和字母全部大写的标识符有专门的含义. <3>变量名使用多个单词可使程序具有更好的可读性,这种情况下,需要将第一个单词外的每个单词首字母大写或在每个单词之间加入下划线_以区分不同的单词. 2.只有内建数据类型和函数对象类型适用于传值调用.对于其他类型,建议使用引用常量传参,而不是传值.因为引用常量参数的方式更

Open XML SDK 在线编程黑客松

2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的程序猿们提供一个在线动手开发,学习交流,技术分享,发挥创意与竞技的盛宴. 我们为参赛队伍准备了丰富的技术干货,国内外高手无私分享以及技术支持,逐步引导的在线学习视频教程与技术文档,场景范例,在线编程及演示环境,社区互动,丰富礼品(如极客学院特别为每位参赛人员提供月VIP码,用户可以免费学习极客学院全网课程)及

《七周七语言:理解多种编程范型》のIo课后习题答案

哎,因为上周忙着写OAuth2.0服务端框架草稿 ,耽误了一周学习Io Language了. 本篇习题解答是接着 <七周七语言:理解多种编程范型>のRuby课后习题答案 Io是原型语言,类似于JavaScript,并不区别类和对象,所有的东东都是对象,对象的数据结构就是由键值表来维护的(在Io中就是所谓的槽),通过各种消息传递给对象来实现打印输出,复制对象等功能.因为语法非常简单(也木有语法糖),所以你可以尽情构建自己的库和功能. 第一天: 1. 对1+1求值,然后对1+"one&q

VS2012+C语言+图形界面窗口+读取TXT文件+显示

#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define ID_TIMER 1 LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); //声明回调函数 int WINAPI WinMain(HINSTANCE hInstance, HINST

java窗口编程(1)

在使用java进行窗口编程时,需要使用到它的扩展包javax,使用到的组件基本都在javax.swing中.所以首先需要导入: import javax.swing.*; swing中有三个顶层容器,JFrame.JDialog.JApplet,要在屏幕上显示,容器是基础,其它的组件必须依托于某一种容器菜能展现出来.所以通常我们会将写一个类继承某一种容器,然后按照我们的需求,添加其它的组件. public myFrame extends Frame{ public myFrame() { set

C语言与MATLAB接口 编程与实例 李传军编着

罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ****************************************************** C-MEX函数:从MATLAB调用C语言或Fortran语言编写的函数. MEX文件:是一种按一定格式,使用C语言或者FORTRAN语言编写的,由MATLAB解释器自动调用并执行的动态链接函数.在Windows系统中,MEX

C语言中的多线程编程

很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看一个简单的单线程程序: /* 06.3.6 Sghello.c Hello,world -- Single Thread */ #include #define NUM 6 int main() { void print_msg(char*); print_msg("hello,"); p

c语言之良好的编程习惯(一)

1.在程序的某些地方加上简短的注释会增加程序的可读性. 2.在书写格式上,所有的case需要对齐,每个case后的语句要有一定的缩进并对齐,以便容易的看出各个分支的条件依据与对应执行的操作. 允许将想通操作的case及对应的常量表达式连续排列,对应的操作的语句组和break只在最后一个case出出现. 3.一般情况下头文件中包括变量.宏定义.枚举.结构和函数接口的声明,而C文件中包括具体实现细节. 4.自定义头文件时,应避免与编译器提供的头文件冲突.可以采用的方法是定义标识符时不使用前缀,即不使

c语言之良好的编程习惯(三)

1.同一个文件在每次调用输入输出函数时,都将产生一个新的ferror()函数值,因此在调用输入输出函数后应该立即检查ferror的函数值,否则信息会丢失. 2.使用临时文件中需要考虑以下两个问题. <1>保证临时文件间的文件名不互相冲突 <2>保证临时文件中的内容不被其他用户偷看.删除.修改. 3.使用目录时需要考虑以下几点. <1>信息量大小.目录适合存放小的信息量,可以利用指针指向大的文件. <2>信息的类型.目录通常是属性的信息. <3>读