win32显示位图

                  位图信息显示
  程序思路:
                 是很普通的思路,网上已经说了很多遍了,就是创建dc、创建兼容dc、
       加载位图、显示位图。
 
                 在这个函数里,工程是空的工程,所以,窗口的创建是需要代码创建的。
       使用的数据结构是:WNDCLASS和   函数:RegisterClass()、CreateWindow()。
 
  使用到的函数:
                      1.LoadImage()——加载磁盘上的位图,如果在IDE里添加资源的方式
                           添加位图,那么使用函数是:LoadBitmap()
   2.CreateCompatibleBitmap()——创建兼容位图
   3.CreateCompatibleDC()——创建兼容dc
   4.SelectObject()——选择对象
   5.BitBlt()——显示位图,如果需要缩放就用StretchBlt()
        
  存在的问题:
                    1.如果改变窗口大小的速度很快的时候,就死掉了,不知道为什么
   2.鼠标在窗口上晃动的时候屏幕会闪、会出现一条水平的白线
 
              I don't know how to reslove it   :(


#include <stdio.h>
#include <windows.h>

LRESULT CALLBACK WindowProc(
   HWND hwnd,         // handle to window
   UINT uMsg,         // message identifier
   WPARAM wParam,   // first message parameter
   LPARAM lParam    // second message parameter
);


HINSTANCE g_hInstance;

int WINAPI WinMain(
   HINSTANCE hInstance,   // handle to current instance
   HINSTANCE hPrevInstance,   // handle to previous instance
   LPSTR lpCmdLine,         // pointer to command line
   int nCmdShow         // show state of window       
   ){


WNDCLASS fans;
fans.style=CS_HREDRAW | CS_VREDRAW ;
fans.lpfnWndProc=WindowProc;
fans.cbClsExtra=0;
fans.cbWndExtra=0;
fans.hInstance=hInstance;//这个就是WinMain函数的第一个参数。
       fans.hIcon=LoadIcon(NULL,IDI_ERROR);
fans.hCursor=LoadCursor(NULL,IDC_CROSS);
fans.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
fans.lpszMenuName=NULL;
fans.lpszClassName="Idontknow";
RegisterClass(&fans);
       g_hInstance=hInstance;

HWND h;
h=CreateWindow("Idontknow",
"woshinid",
WS_OVERLAPPEDWINDOW,
100,100,800,480,
NULL,NULL,
hInstance,
NULL);
       ShowWindow(h,SW_SHOWNORMAL);
       UpdateWindow(h);
       MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;

}


LRESULT CALLBACK WindowProc(
   HWND hwnd,         // handle to window
   UINT uMsg,         // message identifier
   WPARAM wParam,   // first message parameter
   LPARAM lParam    // second message parameter
   ){
PAINTSTRUCT paintinformation;
HDC hdc;
switch(uMsg)
{
case WM_LBUTTONDOWN:
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&paintinformation);
RECT rect;
GetClientRect(hwnd,&rect);
HBITMAP   bimp = (HBITMAP)LoadImage(NULL,
"C:\aa.bmp",IMAGE_BITMAP,1280,800,LR_LOADFROMFILE);
CreateCompatibleBitmap(hdc,1280,800);
HDC hh=CreateCompatibleDC(NULL);
SelectObject(hh,bimp);
BitBlt(hdc,0,0,400,200,hh,0,0,SRCCOPY);
EndPaint(hwnd,&paintinformation);
                   ReleaseDC(hwnd,hh);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


ReleaseDC(hwnd,hdc);

return 0L;
}//WindowProc()函数结束
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Windows 上进行屏幕录制,可以使用 win32api 库中的一些函数来捕获屏幕图像。以下是使用 Python 代码进行屏幕录制的示例: ```python import win32api import win32gui import win32ui import win32con import numpy as np import cv2 # 获取屏幕大小 width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN) # 创建 Device Context hdc_screen = win32gui.GetDC(0) hdc_source = win32ui.CreateDCFromHandle(hdc_screen) hdc_dest = hdc_source.CreateCompatibleDC() # 创建位图 bmp = win32ui.CreateBitmap() bmp.CreateCompatibleBitmap(hdc_source, width, height) hdc_dest.SelectObject(bmp) # 开始捕获屏幕图像 while True: # 捕获屏幕图像 hdc_dest.BitBlt((0, 0), (width, height), hdc_source, (0, 0), win32con.SRCCOPY) # 将位图转换为 numpy 数组 bmp_info = bmp.GetInfo() bmp_str = bmp.GetBitmapBits(True) img = np.fromstring(bmp_str, dtype='uint8') img.shape = (bmp_info['bmHeight'], bmp_info['bmWidth'], 4) img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) # 显示图像 cv2.imshow('Screen Capture', img) # 按下 ESC 键退出 if cv2.waitKey(1) == 27: break # 释放资源 hdc_dest.DeleteDC() hdc_source.DeleteDC() win32gui.ReleaseDC(0, hdc_screen) cv2.destroyAllWindows() ``` 这个示例代码使用 win32api 库中的 GetSystemMetrics() 函数获取屏幕大小,使用 CreateDCFromHandle() 函数创建 Device Context,使用 CreateCompatibleBitmap() 函数创建位图,然后使用 BitBlt() 函数捕获屏幕图像,并使用 GetBitmapBits() 函数将位图转换为 numpy 数组。最后,使用 OpenCV 库中的 cv2.imshow() 函数显示图像,并使用 cv2.waitKey() 函数等待按键事件,如果按下 ESC 键则退出循环。 请注意,这个示例代码只是一个简单的屏幕录制示例,对于实际的屏幕录制应用程序,需要更多的功能和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值