Windos编程,获取窗口的尺寸

前言

学习小甲鱼的画\(sin\)函数的例子,发现最开始创建窗口时cxClient和cyClient不能很好的赋值

WM_SIZE和WM_PAINT

经过我的实践发现:在刚刚创建窗口时WM_SIZE和WM_PAINT消息的调用顺序是随机的,而且大部分时候先是WM_PAINT

如果cxClient和cyClient需要经过WM_SIZE来初始化,并且WM_PAINT消息处理中需要使用这两个变量,那么第一次的WM_PAINT可能会不正常

这个时候可以选择手动调整一下窗口的大小,但是用户体验肯定是很差的

一种解决方案

由于WM_CREATE消息肯定优先于WM_PAINT处理,那么我们可以在处理WM_CREAT时初始化cxClient和cyClient

利用GetClientRect获取当前的矩形结构

case WM_CREATE:
        GetClientRect(hwnd, &rect);
        cxClient = rect.right-rect.left ;
        cyClient = rect.bottom- rect.top ;
        return 0;

画\(sin\)函数代码

/* -------------------------------------------------------------------
                    MyWindows.c -- 基本窗口模型
                                《Windows 程序设计(SDK)》视频教程
--------------------------------------------------------------------*/

#include <Windows.h>
#include <tchar.h>
#include <math.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{

    static TCHAR szAppName[] = TEXT("MyWindows");
    HWND hwnd;//窗口句柄

    MSG msg;//消息结构
    WNDCLASS wndclass;//窗口类结构   

    wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口类型
    wndclass.lpfnWndProc = WndProc;//指定窗口过程
    wndclass.cbClsExtra = 0;//预留的额外空间
    wndclass.cbWndExtra = 0;//预留的额外空间
    wndclass.hInstance = hInstance;//应用程序的实例句柄
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//为所有基于该窗口类的窗口设定一个图标
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//为所有基于该窗口类的窗口设定一个鼠标指针
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//	指定窗口背景色
    wndclass.lpszMenuName = NULL;//	指定窗口菜单
    wndclass.lpszClassName = szAppName;//指定窗口类名

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,//类名
        TEXT("鱼C工作室"),//标题
        WS_OVERLAPPEDWINDOW,//风格
        CW_USEDEFAULT,//初始x坐标
        CW_USEDEFAULT,//初始y坐标
        CW_USEDEFAULT,//初始宽度
        CW_USEDEFAULT,//初始高度
        NULL,//父窗口句柄
        NULL,//窗口菜单句柄
        hInstance,//程序实例句柄
        NULL);//创建参数

    ShowWindow(hwnd, iCmdShow);//显示窗口
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0))//消息循环
    {
        TranslateMessage(&msg);//翻译一些键盘消息
        DispatchMessage(&msg);//将消息发送给窗口过程
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int cxClient, cyClient;
    HDC hdc;//设备环境句柄
    PAINTSTRUCT ps;//绘制结构
    RECT rect;//矩形结构
    //int stx = 0, sty =0;
    POINT apt[1000];
    int num = 1000;
    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        return 0;
    case WM_CREATE:
        GetClientRect(hwnd, &rect);
        cxClient = rect.right-rect.left ;
        cyClient = rect.bottom- rect.top ;
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);//获得设备句柄

        LineTo(hdc, cxClient, cyClient);
        for (int i = 0; i < num; i++) {
            apt[i].x = i * cxClient / num;
            apt[i].y = (long)(cyClient / 2 * sin(i * 3.1415926 * 2.0 / num)) + cyClient / 2;
        }
        Polyline(hdc, apt, num);
        EndPaint(hwnd, &ps);// 函数标记指定窗口的绘画过程结束

         return 0;

    case WM_DESTROY://窗口关闭
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);//交给windows去处理
}

原文地址:https://www.cnblogs.com/carcar/p/12689000.html

时间: 2024-08-02 02:23:48

Windos编程,获取窗口的尺寸的相关文章

Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)

Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sender: TObject);var lppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;s:string;beginListBox1.Items.Clear ;Hand := CreateToolhelp32Snapshot(TH

Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()

getWindowVisibleDisplayFrame()方法 getWindowVisibleDisplayFrame()是View类下的一个方法,从方法的名字就可以看出,它是用来获取当前窗口可视区域大小的.就是contentParentView +actionbar的高度 此方法的原型为 public void getWindowVisibleDisplayFrame(Rect outRect); 1 它接受一个Rect对象作为参数,执行过程中会根据当前窗口可视区域大小更新outRect的

Qt编程获取鼠标移动事件

想做下面一个效果:想当鼠标移动到按钮上的时候,按钮就变大,图标换个大的,鼠标不在按钮上的时候,按钮就变小,图标也换成小的,感觉比较Cool 实现原理:为每个按钮设置监听属性 void MainHomeForm::init() { //为按钮注册事件 ui->SystemSetButton->installEventFilter(this); ui->ZoneSetButton->installEventFilter(this); } //系统监听器监听按钮对象 bool MainH

获取窗口实例句柄

方法一 GetWindowLong(hwnd, GWL_HINSTANCE); 获取该窗口句柄做用的实例句柄? 方法二 WM_CREATE? lpcs = (LPCREATESTRUCT) lParam; lpcs->hInstance;获取窗口实例句柄,布布扣,bubuko.com

【工具】获取窗口与控件信息

[工具]获取窗口与控件信息 常言道,工欲善其事,必先利其器.在脚本中常见的一种操作是操作窗口或控件,在操作之前,首先必须获取目标的各种信息,这时就要用上辅助工具了.本文会介绍一些获取窗口.控件信息的常用工具,这里的先后顺序是随意安排.如果目前用的没什么问题就继续用着,如果对某些地方不满意则可试试其他.简单的截图不容易全面反映整个工具的功能和特色,使用才能获得真实体验. Active Window Info 评论:这个最初来自于 AutoIt3 且安装包中自带的工具,就无需过多介绍了.功能简陋,但

3.JAVA之GUI编程Frame窗口

Frame 是带有标题和边框的顶层窗口. 创建图形化界面思路: 1.创建frame窗体: 2.对窗体进行基本设置: 比如大小.位置.布局 3.定义组件: 4.将组件通过add方法添加到窗体中: 5.让窗体显示,通过setVisible(ture). ****************************** 新建一个class类,名称为:studyframe 功能实现如下几点: 1.建立一个窗口: 2.窗口有标题: 3.窗口大小设置: 4.窗口位置设置: 5.窗口可见. 代码如下: impor

winfrom 获取当前屏幕尺寸

获取当前工作区宽度和高度(工作区不包含状态栏) int ScreenWidth = Screen.PrimaryScreen.WorkingArea.Width; int ScreenHeight = Screen.PrimaryScreen.WorkingArea.Height; winfrom 获取当前屏幕尺寸,布布扣,bubuko.com

Linux下编程获取本地IP地址的常见方法

转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之需. 获取本机IP地址,是一个相当灵活的操作,原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的.比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡.用户计算机所在网络拓扑结构未知,主机名设置是一个可选项,并且同样可以为一

谷歌浏览器下jquery无法获取图片的尺寸解决方案

谷歌浏览器下jquery无法获取图片的尺寸解决方案: 本章节介绍一下在谷歌浏览器下利用jquery无法获取图片尺寸的现象,而在IE和火狐浏览器下能够正常获得,当然也不是任何时候都无法获取图片尺寸,下面就来介绍一下如何解决此问题. 代码如下: $(document).ready(function(){   var img_h=$img.height();    var img_w=$img.width();  }) 以上代码在IE和火狐中没有问题,但是在谷歌中可能会出现问题,之所以没货的尺寸就是因