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);//释放内存位图 }

OneTechCloud香港/日本/美国CN2 GIA月付9折季付8折,可选原生IP或高防VPS

OneTechCloud(易科云)是一家主打CN2等高端线路的VPS主机商家,成立于2019年,提供的产品包括VPS主机和独立服务器租用等,数据中心可选美国洛杉矶、中国香港、日本等,有CN2 GIA线路、AS9929、高防、原生IP等。目前商家针对全场VPS主机提供月付9折,季付8折优惠码,优惠后香港VPS最低季付64元起(≈21.3元/月),美国洛杉矶CN2 GIA线路+20Gbps防御型VPS...

gcorelabs:美国GPU服务器,8张RTX2080Ti,2*Silver-4214/256G内存/1T SSD/

gcorelabs提供美国阿什本数据中心的GPU服务器(显卡服务器),默认给8路RTX2080Ti,服务器网卡支持2*10Gbps(ANX),CPU为双路Silver-4214(24核48线程),256G内存,1Gbps独享带宽仅需150欧元、10bps带宽仅需600欧元,不限流量随便跑吧。 官方网站 :https://gcorelabs.com/hosting/dedicated/gpu/ ...

CloudCone 新增洛杉矶优化线路 年付17.99美元且简单线路测试

CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...

allocatehwnd为你推荐
帕萨特和迈腾哪个好迈腾与帕萨特那个好?帕萨特和迈腾哪个好迈腾和帕萨特对比,哪个更好?绝地求生加速器哪个好现在绝地求生哪个加速器好点?尼康和佳能单反哪个好尼康和佳能哪个好51空间登录以前的51空间怎么进?360云盘登录360云盘登陆账号360云网盘下载我有别人的360云盘里面的东西的链接,我要怎么下载他的这个东西?360云盘同步版360云盘同步版整理资料以哪方为准(本地还是云盘)?360云盘共享群360云盘怎么找共享群什么时候买车最便宜什么时候买车最便宜?优惠最多?
什么是域名 域名中介 安徽双线服务器租用 php主机租用 xenvps 如何查询ip地址 京东云擎 好看的桌面背景大图 ssh帐号 搜狗抢票助手 阿里云代金券 eq2 警告本网站美国保护 服务器干什么用的 江苏双线服务器 空间登录首页 带宽租赁 西安服务器托管 德隆中文网 lamp什么意思 更多