c语言 如何用代码实现关闭窗口,C语言实现SDK窗口编程(示例代码)

//---------------------------------------------------------------------------

#include 

//===========================================================================

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值