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

[戻る]
TKO 2009/11/19(木) 19:16:17
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 2009/11/20(金) 09:44:20
以下の3つの関数が何者か分かりません。
  CreateBackbuffer()
  WriteBitmap()
  ShowText()
あと、一度にたくさん質問しすぎです。
一つずつ質問しましょう。

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

TKO 2009/11/20(金) 13:40:06
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 2009/11/20(金) 13:51:18
現在デスクトップを読み込み
デスクトップの画像を
bitmapファイルで保存するというところまではできています

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

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

ryo 2009/11/20(金) 16:59:34
前半の内容の後処理をしないまま
後半に入っているので、HDCとHBITMAPの関係がめちゃくちゃ

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

bun 2009/11/20(金) 18:16:13
CreateBackbuffer()の出所はこれかな?
  http://eternalwindows.jp/graphics/bitmap/bitmap10.html

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

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

TKO 2009/11/25(水) 14:59:21
[[解決]]
丁寧に回答してくださってありがとうございます
とてもわかりやすかったです

古いスレッドには追加発言できません。