allocatehwnd怎样才能用VC的onpaint函数在位图上画点和线呢?就是画完之后能改变位图。VC里有这样的函数吗?送分!

allocatehwnd  时间:2021-01-12  阅读:()

怎样才能用VC的onpaint函数在位图上画点和线呢?就是画完之后能改变位图。VC里有这样的函数吗?送分!

下面的代码转自MSDN,"Storing an Image" // 获取HBITMAP的位图信息 PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp) { BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits; // Retrieve the bitmap color format, width, and height. if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) errhandler("GetObject", hwnd); // Convert the color format to a count of bits. cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); if (cClrBits == 1) cClrBits = 1; else if (cClrBits <= 4) cClrBits = 4; else if (cClrBits <= 8) cClrBits = 8; else if (cClrBits <= 16) cClrBits = 16; else if (cClrBits <= 24) cClrBits = 24; else cClrBits = 32; // Allocate memory for the BITMAPINFO structure. (This structure // contains a BITMAPINFOHEADER structure and an array of RGBQUAD // data structures.) if (cClrBits != 24) pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits)); // There is no RGBQUAD array for the 24-bit-per-pixel format. else pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER)); // Initialize the fields in the BITMAPINFO structure. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = bmp.bmWidth; pbmi->bmiHeader.biHeight = bmp.bmHeight; pbmi->bmiHeader.biPlanes = bmp.bmPlanes; pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; if (cClrBits < 24) pbmi->bmiHeader.biClrUsed = (1<<cClrBits); // If the bitmap is pressed, set the BI_RGB flag. pbmi->bmiHeader.biCompression = BI_RGB; // Compute the number of bytes in the array of color // indices and store the result in biSizeImage. // For Windows NT, the width must be DWORD aligned unless // the bitmap is pressed. This example shows this. // For Windows 95/98/Me, the width must be WORD aligned unless the // bitmap is pressed. pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight; // Set biClrImportant to 0, indicating that all of the // device colors are important. pbmi->bmiHeader.biClrImportant = 0; return pbmi; } //将HBITMAP保存到文件 void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC) { HANDLE hf; // file handle BITMAPFILEHEADER hdr; // bitmap file-header PBITMAPINFOHEADER pbih; // bitmap info-header LPBYTE lpBits; // memory pointer DWORD dwTotal; // total count of bytes DWORD cb; // incremental count of bytes BYTE *hp; // byte pointer DWORD dwTmp; pbih = (PBITMAPINFOHEADER) pbi; lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if (!lpBits) errhandler("GlobalAlloc", hwnd); // Retrieve the color table (RGBQUAD array) and the bits // (array of palette indices) from the DIB. if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS)) { errhandler("GetDIBits", hwnd); } // Create the .BMP file. hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hf == INVALID_HANDLE_VALUE) errhandler("CreateFile", hwnd); hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; // Compute the offset to the array of color indices. hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file. if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)) { errhandler("WriteFile", hwnd); } // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, ( NULL))) errhandler("WriteFile", hwnd); // Copy the array of color indices into the .BMP file. dwTotal = cb = pbih->biSizeImage; hp = lpBits; if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) errhandler("WriteFile", hwnd); // Close the .BMP file. if (!CloseHandle(hf)) errhandler("CloseHandle", hwnd); // Free memory. GlobalFree((HGLOBAL)lpBits); } ------- 改变位图,就是把位图加载到设备上,然后绘图,最后把设备位图重新保存。

LZ想怎么改变位图? ------- 修改位图补完版: 在应用程序的OnPaint里添加如下代码,将位图绘制出来 void Cxxx::OnPaint() { CBitmap bmp; if(bmp.Attach((HBITMAP)::LoadImage(AfxGetApp()->m_hInstance, _T(".\bmptest.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE))) //从文件加载位图,这个应该放到程序初始化里面,将bmp作为成员变量避免重复加载,但是我懒得写那么多了 { CPaintDC dc(this); CDC memDC; memDC.CreateCompatibleDC(&dc);//创建内存DC CBitmap *pOldbmp = memDC.SelectObject(&bmp); //将位图加载到内存DC CRect rc; GetClientRect(rc);//获取客户区大小,如果需要画整个位图,可以根据需要修改 dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);//将位图绘制到窗口上 dc.SetPixel(10, 10, RGB(0, 0, 255)); //在指定的位置画一个蓝色的点 memDC.SelectObject(pOldbmp);//释放 } } 在任意一个命令里写下如下操作代码保存位图 void Cxxx::OnCommandXXXX() { CClientDC dc(this); CRect rcClient; GetClientRect(rcClient);//取客户区大小 CDC memDC; memDC.CreateCompatibleDC(&dc);//创建内存DC CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());//创建内存位图,大小刚好可以放下客户区内容,这里根据需要修改 CBitmap *pOldBmp = memDC.SelectObject(&bmp); memDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dc, 0, 0, SRCCOPY);//将窗口内容画到内存位图上 //这里使用上面给出的两个函数来保存位图到文件当中 PBITMAPINFO pbmi = CreateBitmapInfoStruct(GetSafeHwnd(), bmp);//建立位图信息 CreateBMPFile(GetSafeHwnd(), _T(".\bmptest.bmp"), pbmi, bmp, memDC);//保存位图到文件 LocalFree(pbmi);//由于pbmi由创建函数分配空间,需要调用者来释放 memDC.SelectObject(pOldBmp);//释放内存位图 }

ReliableSite怎么样,月付$95美国洛杉矶独立服务器

ReliableSite怎么样?ReliableSite好不好。ReliableSite是一家成立于2006年的老牌美国商家,主要经营美国独立服务器租赁,数据中心位于:洛杉矶、迈阿密、纽约,带宽1Gbps起步,花19美元/月即可升级到10Gbps带宽,月流量150T足够各种业务场景使用,且免费提供20Gbps DDoS防护。当前商家有几款大硬盘美国独服,地点位于美国洛杉矶或纽约机房,机器配置很具有...

819云(240元)香港CN2 日本CN2 物理机 E5 16G 1T 20M 3IP

819云是我们的老熟人了,服务器一直都是稳定为主,老板人也很好,这次给大家带来了新活动,十分给力 香港CN2 日本CN2 物理机 E5 16G 1T 20M 3IP 240元0官方网站:https://www.819yun.com/ 特惠专员Q:442379204套餐介绍套餐CPU内存硬盘带宽IP价格香港CN2 (特价)E5 随机分配16G1T 机械20M3IP240元/月日本CN2 (...

月费$389,RackNerd美国大硬盘独立服务器

这次RackNerd商家提供的美国大硬盘独立服务器,数据中心位于洛杉矶multacom,可选Windows、Linux镜像系统,默认内存是64GB,也可升级至128GB内存,而且硬盘采用的是256G SSD系统盘+10个16TSAS数据盘,端口提供的是1Gbps带宽,每月提供200TB,且包含5个IPv4,如果有需要更多IP,也可以升级增加。CPU核心内存硬盘流量带宽价格选择2XE5-2640V2...

allocatehwnd为你推荐
内存卡数据恢复软件急需一个储存卡数据恢复软件美国10次啦导航与美国GPS可以抗衡的国产导航有哪些?聚酯纤维和棉哪个好聚酯纤维面料和纯棉面料哪个好海克斯皮肤哪个好LOL用100块是抽海克斯好还是抽蛮王的生化领主的活动还是直接买皮肤好dnf魔枪士转职哪个好dnf魔枪士转职哪个职业好?播放器哪个好什么手机视频播放器比较好用?qq空间登录QQ页面上空间不能登陆了,怎么回事?360云u盘介绍一下360云u盘什么快递最便宜寄大物件什么快递便宜最便宜的手机最便宜最好的手机是什么牌子的
东莞服务器租用 最新代理服务器地址 域名服务器的作用 国内免备案主机 linode日本 site5 permitrootlogin 淘宝双十一2018 parseerror evssl 网通ip 怎么测试下载速度 双十一秒杀 cdn加速原理 phpmyadmin配置 什么是服务器托管 亚马逊香港官网 南通服务器 yundun 英国伦敦 更多