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

香港物理服务器 E5-2660v2 16G 500GSSD 增送20G防御 688/月 华纳云

#年终感恩活动#华纳云海外物理机688元/月,续费同价,50M CN2 GIA/100M国际大带宽可选,超800G 防御,不限流华纳云成立于2015年,隶属于香港联合通讯国际有限公司。拥有香港政府颁发的商业登记证明,作为APNIC 和 ARIN 会员单位,现有香港、美国等多个地区数据中心资源,百G丰富带宽接入,坚持为海内外用户提供自研顶级硬件防火墙服务,支持T B级超大防护带宽,单IP防护最大可达...

美国高防云服务器 1核 1G 10M 38元/月 百纵科技

百纵科技:美国云服务器活动重磅来袭,洛杉矶C3机房 带金盾高防,会员后台可自助管理防火墙,添加黑白名单 CC策略开启低中高.CPU全系列E52680v3 DDR4内存 三星固态盘列阵。另有高防清洗!百纵科技官网:https://www.baizon.cn/联系QQ:3005827206美国洛杉矶 CN2 云服务器CPU内存带宽数据盘防御价格活动活动地址1核1G10M10G10G38/月续费同价点击...

虎跃云-物理机16H/32G/50M山东枣庄高防BGP服务器低至550元每月!

虎跃科技怎么样?虎跃科技(虎跃云)是一家成立于2017年的国内专业服务商,专业主营云服务器和独立服务器(物理机)高防机房有着高端华为T级清洗能力,目前产品地区有:山东,江苏,浙江等多地区云服务器和独立服务器,今天虎跃云给大家带来了优惠活动,为了更好的促销,枣庄高防BGP服务器最高配置16核32G仅需550元/月,有需要的小伙伴可以来看看哦!产品可以支持24H无条件退款(活动产品退款请以活动规则为准...

allocatehwnd为你推荐
免费个人网站制作怎样免费制作个人网站?美女桌面背景图片适合女生的电脑壁纸手机浏览器哪个好手机浏览器哪个好用朱祁钰和朱祁镇哪个好历史上真实的明英宗是怎么样的?性格之类的。朱祁钰和朱祁镇的相关的最好可以详细点的手机炒股软件哪个好手机炒股软件哪个好啊?dnf魔枪士转职哪个好DNF魔枪士转职转哪个好 决战者征战者转职dnf魔枪士转职哪个好dnf魔枪士转职哪个适合平民玩美国国际集团美国AIG股票,值得长远投资吗??飞信空间登录请问如何登陆我的飞信空间?qqkj空间登录怎么限制qq空间登录.
m3型虚拟主机 域名网站 中文域名交易中心 域名交易网 lnmp 腾讯云盘 新世界机房 美国主机代购 win8.1企业版升级win10 tightvnc 圣诞促销 河南m值兑换 免费网页空间 东莞主机托管 金主 阿里dns 阵亡将士纪念日 带宽测试 汤博乐 重庆联通服务器托管 更多