`
webcode
  • 浏览: 5911712 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

win32 SDK窗口 详解

 
阅读更多

///Class Style 是指窗口本身的 属性

// CS_NOCLOSE就是窗口不能被关闭

// CS_HREDRAW CS_VREDRAW就是在 窗口移动或者 窗口的宽度或者高度改变的时候就会发送 WM_PAINT 消息

//CS_DBLCLKS如果class style 不包括 那么如果用户双击 鼠标 那么不会发送鼠标双击消息

//CS_CLASSDC 这个用于多线程编程 在多个线程对 一个窗体进行操作的时候一次只能有一个线程对窗体进行操作

//CS_DROPSHADOW 0x00020000 加上这个就会在窗体周围产生一块阴影 。。

//CS_OWNDC 有设置这个的class创建的窗口都有个独立的 Device Context 特别是作为主窗体的中 应该都要设置它

//Window Styles 是指窗口的外观

例如 WM_BORDER 有边框

WM_CHILD 子窗体

WS_CAPTION 创建有标题栏的窗口

WS_CHILDWINDOW 设置为子窗体 这样设置就不会显示 菜单栏 Menu Bar 也不能设置 WS_POPUP属性

WS_SIZEBOX WS_THICKFRAME 如果不设置那么窗体不能被改变大小

要设置最大化最小化的时候 也要设置 WS_SYSMENU 否则最大化最小化也不会显示

#include <windows.h>
#include <stdio.h>
#include "WINUSER.H"
LRESULT CALLBACK WinProc( //窗口回调函数的声明
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( //入口函数
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance, //先前实例的一个句柄
LPSTR lpCmdLine, // 命令行
int nCmdShow // 显示状态
)
{

WNDCLASS cls;
cls.cbClsExtra =0 ;
cls.cbWndExtra=0 ;
cls.hbrBackground=(HBRUSH)::GetStockObject(GRAY_BRUSH) ;
cls.hCursor=::LoadCursor(NULL,IDC_ARROW) ;
cls.hIcon=LoadIcon(NULL,IDI_ERROR);
cls.hInstance=hInstance ;
cls.lpfnWndProc=WinProc ;
cls.lpszClassName="SDK";
cls.lpszMenuName="NewMenu";
cls.style=CS_VREDRAW|CS_HREDRAW |CS_DBLCLKS|0x00020000|CS_NOCLOSE;
::RegisterClass(&cls) ;
HWND m_hWnd;
m_hWnd=::CreateWindow("SDK","New Win32 Application",WS_OVERLAPPEDWINDOW|WS_SYSMENU|WS_MINIMIZEBOX,100,200,600,600,NULL,NULL,hInstance,NULL) ; //创建窗口返回窗口的句柄
::ShowWindow(m_hWnd,SW_SHOWNORMAL) ; //显示窗口
::UpdateWindow(m_hWnd) ; //更新窗口
MSG msg ;
while(::GetMessage(&msg,m_hWnd,NULL,NULL)) //从消息队列检索消息
{
::TranslateMessage(&msg) ; //翻译消息
::DispatchMessage(&msg) ; //分发消息
}

return 0 ;
}
LRESULT CALLBACK WinProc(
HWND hwnd, // 窗体的句柄
UINT uMsg, // WM_开头的消息
WPARAM wParam, // 第一个附加参数
LPARAM lParam // 消息的第二个附加参数
)
{
switch(uMsg)
{
case WM_PAINT :
{
HDC hdc ;
PAINTSTRUCT ps ; //填充PAINTSTRUCT 结构体
hdc=::BeginPaint(hwnd,&ps) ; //BeginPaint() EndPaint()只有在响应WM_PAINT 消息的时候才会被调用 作用是从消息队列删除WM_PAINT 消息
//如果此处用GetDC来获取DC那么 就无法从消息队列中取出 WM_PAINT 消息 那么 windows会一直认为这是一个
//Invalid Area 无效区域 那么就会不停的重绘 导致程序卡死 。
::TextOut(hdc,10,10,"Win32_SDK",strlen("Win32_SDK")) ;
::EndPaint(hwnd,&ps); //在响应WM_PAINT 消息的时候 BeginPaint()后面必须跟上 EndPaint()
break;
}

case WM_LBUTTONDOWN:
{
HDC dc ;
dc=::GetDC(hwnd) ; //获得窗口的画布 ClientAprea
TextOut(dc,10,30,"Left Button Down!",strlen("Left Button Down!")) ;
break;

}
case WM_LBUTTONDBLCLK :
{
MessageBox(hwnd,"","",MB_OK) ;
break ;

}
case WM_CLOSE:
{ if(IDYES==::MessageBox(hwnd,"真的要退出?","提示",MB_YESNO))
::DestroyWindow(hwnd) ; //销毁窗体 销毁窗体的时候会发送一个 WM_DESTROY 消息 我们可以拦截这个消息并且调用PostQuitMessage(0)
break ; //来退出程序
}
case WM_DESTROY :
{ ::PostQuitMessage(0); //正常退出
break ;
}
case WM_RBUTTONDOWN :
{
MessageBox(hwnd,"Right Button Down","提示",MB_OK);
break ;
}

default: return DefWindowProc(hwnd,uMsg,wParam,lParam) ; //默认调用缺省的窗口过程

}
return 0 ;
}

分享到:
评论

相关推荐

    使用c++的windows编程帮助文档

    2017/03/25 20:25 9,488,134 Windows Graphics Programming Win32 GDI and DirectDraw.chm 2017/04/03 00:44 43,500,609 WINDOWS+API程序设计参考大全.pdf 2017/03/18 16:47 696,925 WindowsAPI参考大全.chm 2017/11...

    windows消息和消息队列实例详解

    本文详细讲述了windows消息和消息队列的原理与应用方法。分享给大家供大家参考。具体分析如下: ...你可以从典型的SDK程序中窗口消息处理函数是怎么声明和实现的。 对于Windows XP系统:如果顶层窗口停止响

    加密解密.技术内幕.chm

    第3章 Win32 调试API3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个...

    软件加密技术内幕 chm

    3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程...

    软件加密技术内幕

    3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程...

    Dialogic从入门到系统工程师_完整版

    9.5 使用Win32同步机制回调异步模式 218 9.5.1什么是Win32同步机制异步模式 218 9.5.2 Win32同步异步模式例子 219 9.6 SRL高级编程模式总结及辨析 223 9.6.1 各种SRL高级编程模式的优点和弊端 223 9.6.2 高级...

    【软件加密技术内幕】

    &lt;br/&gt;第3章 Win32 调试API &lt;br/&gt;3.1 Win32调试API原理 &lt;br/&gt; 3.1.1 调试相关函数简要说明 &lt;br/&gt; 3.1.2 调试事件 &lt;br/&gt; 3.1.3 如何在调试时创建并跟踪一个进程 &lt;br/&gt; 3.1.4 最主要的循环体...

Global site tag (gtag.js) - Google Analytics