当前位置:首页 > 芯闻号 > 充电吧
[导读]这段时间在研究直接写屏的方法.此问题的起因是: 在 iMX31(WinCE 5.0)上, 屏的分辨为: 800*480. 调用 BitBlt() API 函数画一整屏的动作, 竟然需要 120ms 左


这段时间在研究直接写屏的方法.

此问题的起因是: 在 iMX31(WinCE 5.0)上, 屏的分辨为: 800*480. 调用 BitBlt() API 函数画一整屏的动作, 竟然需要 120ms 左右; 同样的程序, 在 Prima 上只需要 20ms 以内的时间. 

直接写屏, 需要用到以下两个主要的函数: CreateDC(TEXT("DISPLAY"),......) 和 CreateDIBSection().

1) CreateDC(TEXT("DISPLAY"),......) 的用法比较简单, 参考 MSDN 就可以很容易的搞定.

2) CreateDIBSection() API 函数的使用, 花了我一些时间. 因为以前没有用过它, 所以将其使用的方法记录如下:

  {

    HBITMAP hDIBitmap;

    LPBYTE lpBitmapBits;

    BITMAPINFO DriectBmp; 

 

    ZeroMemory(&DriectBmp,sizeof(BITMAPINFO));

    DriectBmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

    DriectBmp.bmiHeader.biWidth = 800;

    DriectBmp.bmiHeader.biHeight = 480;

    DriectBmp.bmiHeader.biPlanes = 1;

    DriectBmp.bmiHeader.biBitCount = 16;

    HDC dcDirect = CreateCompatibleDC(dcBuf);

 

    // 建立 hDIBitmap, dcDirect, 和 lpBitmapBits 之间的关系.

    // 通过 DC 操作向 dcDirect 中写入图形数据, 从 lpBitmapBits 中取得内存数据, 进行内存 Copy 操作, 直接写向显存.

    hDIBitmap = CreateDIBSection(dcDirect, (BITMAPINFO *)&DriectBmp, 

      DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);

    if(NULL != hDIBitmap)

    {

      HGDIOBJ OldBitmap = SelectObject(dcDirect, hDIBitmap);

 

      BitBlt(dcDirect,0,0,800,480,dcBuf,0,0,SRCCOPY);

 

      CopyMemory(gpbFrameAddress,lpBitmapBits,800 * 480 * 2);

 

      SelectObject(dcDirect,OldBitmap);

    }

 

    DeleteObject(hDIBitmap);

    DeleteDC(dcDirect);

  }

 

在研究此问题的过程中, 在 CSDN 上找到一个很好的资源, 也记录在自己这里:

http://topic.csdn.net/u/20090629/09/00b25d0d-d461-47dc-88ad-0e2131a5abc7.html

 

并转载其中关键的代码如下:

 

#include "stdafx.h"

#include "CopyScreen.h"

#include

#include

#include"Jpeg.h"

#define MAX_LOADSTRING 100

 

// 全局变量:

HINSTANCE            g_hInst;            // 当前实例

HWND                g_hWndMenuBar;        // 菜单栏句柄

 

// 此代码模块中包含的函数的前向声明:

ATOM            MyRegisterClass(HINSTANCE, LPTSTR);

BOOL            InitInstance(HINSTANCE, int);

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

 

int WINAPI WinMain(HINSTANCE hInstance,

                   HINSTANCE hPrevInstance,

                   LPTSTR    lpCmdLine,

                   int       nCmdShow)

{

    MSG msg;

 

    // 执行应用程序初始化:

    if (!InitInstance(hInstance, nCmdShow)) 

    {

        return FALSE;

    }

 

    HACCEL hAccelTable;

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_COPYSCREEN));

 

    // 主消息循环:

    while (GetMessage(&msg, NULL, 0, 0)) 

    {

        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 

        {

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

    }

 

    return (int) msg.wParam;

}

 

//

//  函数: MyRegisterClass()

//

//  目的: 注册窗口类。

//

//  注释:

//

ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)

{

    WNDCLASS wc;

 

    wc.style         = CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc   = WndProc;

    wc.cbClsExtra    = 0;

    wc.cbWndExtra    = 0;

    wc.hInstance     = hInstance;

    wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_COPYSCREEN));

    wc.hCursor       = 0;

    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

    wc.lpszMenuName  = 0;

    wc.lpszClassName = szWindowClass;

 

    return RegisterClass(&wc);

}

 

//

//   函数: InitInstance(HINSTANCE, int)

//

//   目的: 保存实例句柄并创建主窗口

//

//   注释:

//

//        在此函数中,我们在全局变量中保存实例句柄并

//        创建和显示主程序窗口。

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

    HWND hWnd;

    TCHAR szTitle[MAX_LOADSTRING];        // 标题栏文本

    TCHAR szWindowClass[MAX_LOADSTRING];    // 主窗口类名

 

    g_hInst = hInstance; // 将实例句柄存储在全局变量中

 

    // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化

    // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。

    SHInitExtraControls();

 

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 

    LoadString(hInstance, IDC_COPYSCREEN, szWindowClass, MAX_LOADSTRING);

 

    //如果它已经在运行,则将焦点置于窗口上,然后退出

    hWnd = FindWindow(szWindowClass, szTitle);    

    if (hWnd) 

    {

        // 将焦点置于最前面的子窗口

        // “| 0x00000001”用于将所有附属窗口置于前台并

        // 激活这些窗口。

        SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));

        return 0;

    } 

 

    if (!MyRegisterClass(hInstance, szWindowClass))

    {

        return FALSE;

    }

 

    hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,

        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

 

    if (!hWnd)

    {

        return FALSE;

    }

 

    // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个

    // 菜单栏)。因此,我们要在创建窗口后调整其大小

    // 如果菜单栏存在

    if (g_hWndMenuBar)

    {

        RECT rc;

        RECT rcMenuBar;

 

        GetWindowRect(hWnd, &rc);

        GetWindowRect(g_hWndMenuBar, &rcMenuBar);

        rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);

 

        MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);

    }

 

    ShowWindow(hWnd, nCmdShow);

    UpdateWindow(hWnd);

 

 

    return TRUE;

}

 

HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight)

{

    // 屏幕和内存设备描述表

    HDC  hScrDC, hMemDC;      

    // 位图句柄

    HBITMAP  hBitmap, hOldBitmap;    

    // 屏幕分辨率

    int  xScrn, yScrn;         

 

    //为屏幕创建设备描述表

    hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);

    //为屏幕设备描述表创建兼容的内存设备描述表

    hMemDC = CreateCompatibleDC(hScrDC);

    // 获得屏幕分辨率

    xScrn = GetDeviceCaps(hScrDC, HORZRES);

    yScrn = GetDeviceCaps(hScrDC, VERTRES);

 

    //存储屏幕的长宽

    nWidth = xScrn;

    nHeight = yScrn;

 

    // 创建一个与屏幕设备描述表兼容的位图

    hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn);

    // 把新位图选到内存设备描述表中

    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);

    // 把屏幕设备描述表拷贝到内存设备描述表中

    BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY);

    //得到屏幕位图的句柄

    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

    //清除 

    DeleteDC(hScrDC);

    DeleteDC(hMemDC);

    // 返回位图句柄

    return hBitmap;

}

 

int Save16BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)//将截屏所得保存为16位的图片

{

    HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

    HDC hOffDC=CreateCompatibleDC(hDC);

    SelectObject(hOffDC,hBitmap);

 

    BITMAP Bitmap;

    GetObject(hBitmap,sizeof(BITMAP),&Bitmap);

 

    HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,

        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

    if(fh == INVALID_HANDLE_VALUE )

        return FALSE;

 

    BITMAPFILEHEADER bfh;

    memset(&bfh,0,sizeof(bfh));

    bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;

    bfh.bfSize= sizeof(bfh)+2*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);

    bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);

    DWORD dwWritten=0;

    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);

    BITMAPINFOHEADER bih;

    memset(&bih,0,sizeof(bih));

    bih.biSize=sizeof(bih);

    bih.biWidth=Bitmap.bmWidth;

    bih.biHeight=Bitmap.bmHeight;

    bih.biPlanes=1;

    bih.biBitCount=16;

 

    if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )

    {

        return FALSE;

    }

 

    BITMAPINFO bitmapInfo;

    memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );

    bitmapInfo.bmiHeader=bih;

 

    HDC hMemDC=CreateCompatibleDC(hDC);    

    BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)];

    HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,

        NULL,0);

    if(hDibBitmap != 0)

    {

        ::SelectObject(hMemDC,hDibBitmap);

        BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);

        WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL);

    }

 

    DeleteObject(hDibBitmap);

    DeleteDC(hDC);

    DeleteDC(hMemDC);

 

    CloseHandle(fh);

 

    return 1;

 

}

 

int Save24BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)//将截屏所得保存为24位的图片

{

    HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

    HDC hOffDC=CreateCompatibleDC(hDC);

    SelectObject(hOffDC,hBitmap);

 

    BITMAP Bitmap;

    GetObject(hBitmap,sizeof(BITMAP),&Bitmap);

 

    HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,

        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

    if(fh == INVALID_HANDLE_VALUE )

        return FALSE;

 

    BITMAPFILEHEADER bfh;

    memset(&bfh,0,sizeof(bfh));

    bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;

    bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);

    bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);

    DWORD dwWritten=0;

    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);

    BITMAPINFOHEADER bih;

    memset(&bih,0,sizeof(bih));

    bih.biSize=sizeof(bih);

    bih.biWidth=Bitmap.bmWidth;

    bih.biHeight=Bitmap.bmHeight;

    bih.biPlanes=1;

    bih.biBitCount=24;

 

    if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )

    {

        return FALSE;

    }

 

    BITMAPINFO bitmapInfo;

    memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );

    bitmapInfo.bmiHeader=bih;

 

    HDC hMemDC=CreateCompatibleDC(hDC);    

    BYTE *m_lpBitBmp=new BYTE[3*Bitmap.bmWidth*Bitmap.bmHeight];

    HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,

        NULL,0);

    if(hDibBitmap != 0)

    {

        ::SelectObject(hMemDC,hDibBitmap);

        BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);

        WriteFile(fh,m_lpBitBmp,3*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL);

    }

 

    DeleteObject(hDibBitmap);

    DeleteDC(hDC);

    DeleteDC(hMemDC);

 

    CloseHandle(fh);

 

    return 1;

 

}

 

/*索引颜色/颜色表 

 

位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色(通常不超过256种)编制成颜色表,

然后将图片中原有颜色用颜色表的索引来表示。

这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形,

不适合压缩照片等色彩丰富的图形。 */

 

int Save32BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)//将截屏所得保存为32位带颜色表的图片

{

    /*若不使用颜色表,则去掉bih.biCompression=BI_BITFIELDS;这句,然后

    不设置bitmapInfo.bmiColors[0].rgbRed=255;

    bitmapInfo.bmiColors[0].rgbGreen=255;

    bitmapInfo.bmiColors[0].rgbBlue=255;*/

 

    HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

    HDC hOffDC=CreateCompatibleDC(hDC);

    SelectObject(hOffDC,hBitmap);

 

    BITMAP Bitmap;

    GetObject(hBitmap,sizeof(BITMAP),&Bitmap);

 

    HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,

        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

    if(fh == INVALID_HANDLE_VALUE )

        return FALSE;

 

    BITMAPFILEHEADER bfh;

    memset(&bfh,0,sizeof(bfh));

    bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;

    bfh.bfSize= sizeof(bfh)+4*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);

    bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);

 

    DWORD dwWritten=0;

    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);

    BITMAPINFOHEADER bih;

    memset(&bih,0,sizeof(bih));

    bih.biSize=sizeof(bih);

    bih.biWidth=Bitmap.bmWidth;

    bih.biHeight=Bitmap.bmHeight;

    bih.biPlanes=1;

    bih.biBitCount=32;

    bih.biCompression=BI_BITFIELDS;

 

 

    if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )

    {

        return FALSE;

    }

 

    BITMAPINFO bitmapInfo;

    memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );

    bitmapInfo.bmiHeader=bih;

    bitmapInfo.bmiColors[0].rgbRed=255;

    bitmapInfo.bmiColors[0].rgbGreen=255;

    bitmapInfo.bmiColors[0].rgbBlue=255;

 

 

    HDC hMemDC=CreateCompatibleDC(hDC);    

    BYTE *m_lpBitBmp=new BYTE[4*Bitmap.bmWidth*Bitmap.bmHeight];

    HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,

        NULL,0);

    if(hDibBitmap != 0)

    {

        ::SelectObject(hMemDC,hDibBitmap);

        BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);

        WriteFile(fh,m_lpBitBmp,4*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL);

    }

 

    DeleteObject(hDibBitmap);

    DeleteDC(hDC);

    DeleteDC(hMemDC);

 

    CloseHandle(fh);

 

    return 1;

 

}

 

int SaveJPEGToFile(HBITMAP hBitmap,LPCSTR lpFileName)//将截屏所得保存为jpeg图片

{

 

 

    HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

    HDC hOffDC=CreateCompatibleDC(hDC);

    SelectObject(hOffDC,hBitmap);

 

    BITMAP Bitmap;

    GetObject(hBitmap,sizeof(BITMAP),&Bitmap);

 

    HANDLE fh=CreateFile((LPCWSTR)lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,

        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

    if(fh == INVALID_HANDLE_VALUE )

        return FALSE;

 

    BITMAPFILEHEADER bfh;

    memset(&bfh,0,sizeof(bfh));

    bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;

    bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);

    bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);

    DWORD dwWritten=0;

//    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);

    BITMAPINFOHEADER bih;

    memset(&bih,0,sizeof(bih));

    bih.biSize=sizeof(bih);

    bih.biWidth=Bitmap.bmWidth;

    bih.biHeight=Bitmap.bmHeight;

    bih.biPlanes=1;

    bih.biBitCount=24;

 

    /*if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )

    {

        return FALSE;

    }*/

 

    BITMAPINFO bitmapInfo;

    memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );

    bitmapInfo.bmiHeader=bih;

 

    HDC hMemDC=CreateCompatibleDC(hDC);    

    BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)];

    HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,

        NULL,0);

    if(hDibBitmap != 0)

    {

        ::SelectObject(hMemDC,hDibBitmap);

        BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);

        //WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL);

         WriteJPEGFile(lpFileName, m_lpBitBmp,Bitmap.bmWidth,Bitmap.bmHeight,TRUE, 60);

 

    }

 

    DeleteObject(hDibBitmap);

    DeleteDC(hDC);

    DeleteDC(hMemDC);

 

    CloseHandle(fh);

 

    return 1;

 

}

 

 

//

//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)

//

//  目的: 处理主窗口的消息。

//

//  WM_COMMAND    - 处理应用程序菜单

//  WM_PAINT    - 绘制主窗口

//  WM_DESTROY    - 发送退出消息并返回

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    int wmId, wmEvent;

    PAINTSTRUCT ps;

    HDC hdc;

 

    static SHACTIVATEINFO s_sai;

    int iWidth,iHeight;

    HBITMAP hBitmap;

 

    static int s_cxBegin;

    static int s_cyBegin;

    static int s_cxEnd;

    static int s_cyEnd;

    switch (message) 

    {

        case WM_COMMAND:

            wmId    = LOWORD(wParam); 

            wmEvent = HIWORD(wParam); 

            // 分析菜单选择:

            switch (wmId)

            {

                case IDM_HELP_ABOUT:

                    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);

                    break;

                case IDM_OK:

                    SendMessage (hWnd, WM_CLOSE, 0, 0);                

                    break;

 

                case ID_RGB16:

 

                    hBitmap=CopyScreenToBitmap(iWidth,iHeight);

                    Save16BitmapToFile(hBitmap,TEXT("//a.bmp"));

                    break;

 

                case ID_RGB24:

 

                    hBitmap=CopyScreenToBitmap(iWidth,iHeight);

                    Save24BitmapToFile(hBitmap,TEXT("//b.bmp"));

                    break;

 

                case ID_RGB32:

                    hBitmap=CopyScreenToBitmap(iWidth,iHeight);

                    Save32BitmapToFile(hBitmap,TEXT("//c.bmp"));

                    break;

 

                case ID_JPEG:

                    hBitmap=CopyScreenToBitmap(iWidth,iHeight);

                    SaveJPEGToFile(hBitmap,"d.jpg");

                    break;

 

                default:

                    return DefWindowProc(hWnd, message, wParam, lParam);

            }

            break;

        case WM_CREATE:

            SHMENUBARINFO mbi;

 

            memset(&mbi, 0, sizeof(SHMENUBARINFO));

            mbi.cbSize     = sizeof(SHMENUBARINFO);

            mbi.hwndParent = hWnd;

            mbi.nToolBarId = IDR_MENU;

            mbi.hInstRes   = g_hInst;

 

            if (!SHCreateMenuBar(&mbi)) 

            {

                g_hWndMenuBar = NULL;

            }

            else

            {

                g_hWndMenuBar = mbi.hwndMB;

            }

 

            // 初始化外壳程序激活信息结构

            memset(&s_sai, 0, sizeof (s_sai));

            s_sai.cbSize = sizeof (s_sai);

            break;

 

        case WM_LBUTTONDOWN:

            HCURSOR  hCursor;

            hCursor=SetCursor( LoadCursor(NULL,MAKEINTRESOURCE(IDC_WAIT) ) );

 

            s_cxBegin=LOWORD(lParam);

            s_cyBegin=HIWORD(lParam);

 

            break;

 

 

 

        case WM_LBUTTONUP:

 

            s_cxEnd=LOWORD(lParam);

            s_cyEnd=HIWORD(lParam);

            SetCursor( LoadCursor( GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_ARROW) ) );

 

            break;

        case WM_PAINT:

            hdc = BeginPaint(hWnd, &ps);

 

            // TODO: 在此添加任意绘图代码...

 

            EndPaint(hWnd, &ps);

            break;

        case WM_DESTROY:

            CommandBar_Destroy(g_hWndMenuBar);

            PostQuitMessage(0);

            break;

 

        case WM_ACTIVATE:

            // 向外壳程序通知我们的激活消息

            SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);

            break;

        case WM_SETTINGCHANGE:

            SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);

            break;

 

        default:

            return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

业内消息,近日日本官方表示计划扩大对与半导体或量子计算相关的四项技术的出口限制,这是全球管制战略技术出口的最新举措。该限制措施向所有国家/地区(包括最受惠的贸易伙伴韩国、新加坡和中国台湾)的此类货物将需要出口管制官员的批...

关键字: 半导体 出口管制 商务部 GAA

业内消息,日前中国大陆智能手机品牌大厂华为新款旗舰机Pura70日前重磅上市,掀起一股抢购风潮,一开卖就秒杀,各大渠道均呈现缺货状态,甚至出现黄牛乱象。近期许多海外网站陆续出具拆解报告,赫然发现Pura70除最高端机型外...

关键字: 华为 华为Pura 70

业内消息,近日台积电在美国亚利桑那州的新扩张因其无数的工人待遇恶劣的例子而受到工程师和业内人士的严重关注。当地报告称,该公司在其中国台湾工厂的长期加班文化、残酷的管理风格和对其工程师的不良待遇已经不适当地转移到美国工人上...

关键字: 台积电

Spotify和苹果公司在欧洲再次因为佣金问题发生冲突。苹果公司拒绝了Spotify在欧洲新规生效之后的第2次更新,对此Spotify表达了强烈不满。苹果公司于4月6日响应欧盟近期提出的“限制导流”(anti-steer...

关键字: Spotify 苹果

业内消息,近日韩国存储芯片巨头SK 海力士宣布,为应对用于 AI 的半导体需求剧增,决定扩充 AI 基础设施(Infra)的核心产品即 HBM 等新一代 DRAM 的生产能力(Capacity) 。

关键字: SK海力士 DRAM

近日,美国研究机构TechInsights经过拆解与分析认为,麒麟9010是中芯国际制造的,所用工艺是第二代7nm,也就是N+2。

关键字: 华为 芯片 处理器

4月28日,开放式耳机品牌鲸语系列新品于“2024年第五届中关村硬核科技嘉年华”正式亮相。此次发布的新品中,拥有星空黑与暮沙白双配色的防水骨传导运动耳机——鲸语Alpha,以其独特的设计理念和水陆两栖的卓越性能,吸引了众...

关键字: 开放式耳机 运动耳机 鲸语Alpha

作为一名数码爱好者,更是资深理工男,自然也对3D打印设备兴趣满满,正好看到全球消费级光固化3D打印第一品牌的ELEGOO爱乐酷推出了一款重磅新品,性能上也有非常多颠覆升级,便迫不及待入手一台感受一下。

关键字: 打印机

京元电子在重大讯息说明会中宣布,将出售持有苏州子公司京隆科技 92.1619% 的股权,预估交易金额约 48.85 亿人民币,将于第三季度完成交易,届时将退出中国大陆半导体制造业务。

关键字: 半导体制造 半导体封测 封装测试 京元电子

电子数据的存储与共享在我们生活中占据越来越重要的地位,而传统的硬盘存储已然难以满足人们日益增长的数据存储需求,为此网络附加存储(NAS)则以其便捷、高效的特点,逐渐受到广大用户的青睐。但是提到NAS,很多人可能会觉得它是...

关键字: 存储 铁威马NAS 硬盘存储
关闭
关闭