bitmapを取り込み部分的に表示させるプログラム – プログラミング – Home

bitmapを取り込み部分的に表示させ...
 
通知
すべてクリア

[解決済] bitmapを取り込み部分的に表示させるプログラム


TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

void Drawfisheye(HWND hwnd, POINT& point)
{
HDC hdc;
HDC hmdc;
HWND hwndDesk;
RECT rc;
BITMAP bm;
HBITMAP hbmp;
HBITMAP hbmpPrev;

int BMP_W, BMP_H;

rc.bottom = MyPoint.OldPoint.y-100;
rc.left = MyPoint.OldPoint.x+100;
rc.right= MyPoint.OldPoint.y-100;
rc.top = MyPoint.OldPoint.y;100;

hwndDesk = GetDesktopWindow();

//GetWindowRect(hwndDesk, &rc);

hdc = CreateCompatibleDC(NULL);
hbmp = CreateBackbuffer(rc.right, rc.bottom);
hbmpPrev = (HBITMAP)SelectObject(hdc, hbmp);

BitBlt(hdc, 0, 0, rc.right, rc.bottom, GetWindowDC(hwndDesk), rc.left,
rc.top, SRCCOPY);

GetObject(hbmp, sizeof(BITMAP), &bm);
if (WriteBitmap(TEXT(capture.bmp), rc.right, rc.bottom, bm.bmBits))
ShowText(ok);
else
ShowText(nope);

//hbmp = (HBITMAP)LoadImage( NULL, capture.bmp, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE );

hdc = GetDC(hwnd);
BMP_W = (int)bm.bmWidth;
BMP_H = (int)bm.bmHeight;
GetObject(hbmp, sizeof(BITMAP), &bm);
hmdc = CreateCompatibleDC(hdc);
SelectObject(hmdc, hbmp);

TransparentBlt(hdc, MyPoint.OldPoint.x, MyPoint.OldPoint.y, BMP_W*2,
BMP_H*2, hmdc, 0, 0, BMP_W, BMP_H, (UINT)RGB(0, 0, 255)) ;

DeleteDC(hmdc);

DeleteObject(hbmp);
ReleaseDC(hwnd, hdc);

}

デスクトップのが画像をとりこんで
ポインタでさした
まわりを切り取って
それを拡大し
表示させることによって

ポインタでさしたところをズームさせるようなプログラムをつくりたいのですが
画像が反映されません

よろしくおねがいします


引用未解決
トピックタグ
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

以下の3つの関数が何者か分かりません。
CreateBackbuffer()
WriteBitmap()
ShowText()
あと、一度にたくさん質問しすぎです。
一つずつ質問しましょう。

というわけで、まずはデスクトップ画面取り込みから、
http://www.dinop.com/vc/capture.html


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

CreateBackbuffer()は

HBITMAP CreateBackbuffer(int nWidth, int nHeight)
{
LPVOID lp;
BITMAPINFO bmi;
BITMAPINFOHEADER bmiHeader;

ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = nWidth;
bmiHeader.biHeight = nHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;

bmi.bmiHeader = bmiHeader;

return CreateDIBSection(NULL, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &lp,
NULL, 0);

というものでDIBセクションを割り当てをおこなうものです

WriteBitmap()はファイルを作成してビットマップに必要なデータを書き込む関数です。

ShowText()は画面に文字を表示する関数です
WriteBitmap()が成功するとOKと表示されます


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

現在デスクトップを読み込み
デスクトップの画像を
bitmapファイルで保存するというところまではできています

問題は線を引いているときに
ペンがディスプレイにあたっている部分の周りを
切りとり拡大して再描画したいのですが

毎回切り取ったファイルを作成して
それをLoadImageで読み込んで表示すると
処理が重たくなるので
ファイルを作成しないでbitmapを表示したいと思っています


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

前半の内容の後処理をしないまま
後半に入っているので、HDCとHBITMAPの関係がめちゃくちゃ

一つのビットマップは複数のDCには結び付けられない


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

CreateBackbuffer()の出所はこれかな?
http://eternalwindows.jp/graphics/bitmap/bitmap10.html

ただ、やりたい内容からして、DIBにする必要はなく、
DDBで十分な気がします。
また、いったんファイルに保存する必要性もないと思います。

直接、
hwndDeskのデバイスコンテキストから、
hwndのデバイスコンテキストにTransparentBlt()
すれば良いだけだと思います。


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

丁寧に回答してくださってありがとうございます
とてもわかりやすかったです


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました