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

wordpress投资主题模版 白银黄金贵金属金融投资网站主题

wordpress投资主题模版是一套适合白银、黄金、贵金属投资网站主题模板,绿色大气金融投资类网站主题,专业高级自适应多设备企业CMS建站主题 完善的外贸企业建站功能模块 + 高效通用的后台自定义设置,简洁大气的网站风格设计 + 更利于SEO搜索优化和站点收录排名!点击进入:wordpress投资主题模版安装环境:运行环境:PHP 7.0+, MYSQL 5.6 ( 最低主机需求 )最新兼容:完美...

易探云服务器怎么过户/转让?云服务器PUSH实操步骤

易探云服务器怎么过户/转让?易探云支持云服务器PUSH功能,该功能可将云服务器过户给指定用户。可带价PUSH,收到PUSH请求的用户在接收云服务器的同时,系统会扣除接收方的款项,同时扣除相关手续费,然后将款项打到发送方的账户下。易探云“PUSH服务器”的这一功能,可以让用户将闲置云服务器转让给更多需要购买的用户!易探云服务器怎么过户/PUSH?1.PUSH双方必须为认证用户:2.买家未接收前,卖家...

CloudCone:$14/年KVM-512MB/10GB/3TB/洛杉矶机房

CloudCone发布了2021年的闪售活动,提供了几款年付VPS套餐,基于KVM架构,采用Intel® Xeon® Silver 4214 or Xeon® E5s CPU及SSD硬盘组RAID10,最低每年14.02美元起,支持PayPal或者支付宝付款。这是一家成立于2017年的国外VPS主机商,提供VPS和独立服务器租用,数据中心为美国洛杉矶MC机房。下面列出几款年付套餐配置信息。CPU:...

allocatehwnd为你推荐
电脑桌面背景图适合女生用的桌面背景图片有哪些?迈腾和帕萨特哪个好新帕萨特和新迈腾哪个好?帕萨特和迈腾哪个好迈腾和帕萨特哪个好宝来和朗逸哪个好朗逸和宝来那个比较好些各方面炒股软件哪个好什么炒股软件比较好用?炒股软件哪个好用股票交易软件哪个好?红茶和绿茶哪个好红茶好还是绿茶好?清理手机垃圾软件哪个好清理手机垃圾文件的软件哪个好?百度空间登录百度空间登陆腾讯空间登录QQ空间登录
域名升级访问 提供香港vps 代理域名备案 美国主机排名 openv 新加坡服务器 腾讯云数据库 英文简历模板word realvnc 申请个人网页 英文站群 创梦 空间论坛 七夕促销 699美元 徐正曦 adroit 域名和空间 t云 paypal注册教程 更多