winapiでjpeg画像をドラッグ&ドロップできるプログラムを作っています。
ですが、ドラッグ&ドロップ時に画像がすごくぶれてしまいます。
InvalidateRectで再描画を行っているのですが、第3引数をTRUEではドラッグ&ドロップ時の
画像はでるのですが非常にぶれてしまい、FALSEでは画像はぶれないのですが、前の処理が残ってしまい、画像がたくさん出てしまうようになってしまいます。
ドラッグ&ドロップ時に画像をぶれさせずにするようにはできないのでしょうか?
方法を知っている方がいましたら是非教えてください。
以下に現在使ってあるprocを貼らせていただきます。
#include<windows.h>
#include<olectl.h>
#include <tchar.h>
#include <stdio.h>
HINSTANCE hInst;
HDC hMain;
HBITMAP hBitmap,Bitmap;
BITMAP bitmap;
char str[255];
TCHAR jpeg[3][100] = { "test1.jpg", "test2.jpg", "test4.jpg"} ;
int ii=0;//画像配列の変数
int wx=800;//画面横幅の変数 使うかどうかは未定
int wy=600;//画面縦幅の変数 使うかどうかは未定
int sx=100;
int sy=40;
int xx=0;//座標獲得 ボタンの座標
int yy=0;//座標獲得 ボタンの座標
int xe=0;//LBUTTONUPのときの座標
int ye=0;
int xep1=0;//ドラッグした距離
int yep1=0;
int xep2=0;//ドラッグした距離
int yep2=0;
int flgx=0;
int flgy=0;
int xxx=0;
int yyy=0;
//画像を
void GetHandle1(char File[255],HWND hWnd,HDC hdc){
OLE_HANDLE hOle;
IStream *iStream=NULL;
IPicture *iPicture;
HGLOBAL hMem;
LPVOID pvData;
DWORD nReadByte=0,nFileSize;
HANDLE hFile;
short type;
hFile=CreateFile(File,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);//ファイルを開いてハンドル所得
nFileSize=GetFileSize(hFile,NULL);//ファイルサイズ獲得
hMem=GlobalAlloc(GMEM_MOVEABLE,nFileSize);//動的メモリの確保
//GlobalLockを指定してメモリのポインタを返して初めてメモリの確保が終了します。
pvData=GlobalLock(hMem);
ReadFile(hFile,pvData,nFileSize,&nReadByte,NULL);//↑で確保したメモリにファイルデータ読み込み
//読み込んだファイルの種類を自動的に判別して展開する関数です
GlobalUnlock(hMem);
CloseHandle(hFile);
CreateStreamOnHGlobal(hMem,TRUE,&iStream);//ストリームオブジェクト作成
OleLoadPicture(iStream,nFileSize,FALSE,&IID_IPicture,(LPVOID*)&iPicture);
// iStream->lpVtbl->Release(iPicture);
iPicture->lpVtbl->get_Type(iPicture,&type);
if(type==PICTYPE_BITMAP){
iPicture->lpVtbl->get_Handle(iPicture,&hOle);
}
hBitmap=(HBITMAP)hOle;
SelectObject(hMain,hBitmap);
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
}
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
PAINTSTRUCT ps;
static HDC hdc, hCompatDC;
static BOOL push=FALSE;//ボタンを押したかによる切り替え
static TCHAR strScroll[32];
HRGN hrgn;
xxx=LOWORD(lParam);
yyy=HIWORD(lParam);
switch(uMsg){
case WM_LBUTTONDOWN: // マウスの左ボタンが押されたときに送られてくる
xx=LOWORD(lParam);//x座標獲得
yy=HIWORD(lParam);//y座標獲得
push=TRUE;
return 0;
/*
BUTTONDOWN=xx
BUTTONUP =xe
ドラッグ&ドロップ
ボタンダウンしたときの座標と、ボタンアップしたときの座標の差を計算し、
画像表示時のx,y座標をずらす
*/
case WM_LBUTTONUP:
xe=LOWORD(lParam);//x座標獲得
ye=HIWORD(lParam);//y座標獲得
InvalidateRect( hWnd, NULL, TRUE );
push=FALSE;
return 0;
//WM_LBUTTONDOWNでボタンを押している場合のみ起動
case WM_MOUSEMOVE:
if(push){
xe=LOWORD(lParam);//x座標獲得
ye=HIWORD(lParam);//y座標獲得
if(xx>xe){//右から左の場合
xep1=xx-xe;
flgx=1;
}else if(xe>xx){//左から右の場合
xep2=xe-xx;
flgx=2;
}
if(yy>ye){//下から上の場合
yep1=yy-ye;
flgy=1;
}else if(ye>yy){//上から下の場合
yep2=ye-yy;
flgy=2;
}
InvalidateRect(hWnd , NULL ,FALSE);
}
return 0;
case WM_CREATE:
hdc=GetDC(hWnd);
hMain=CreateCompatibleDC(NULL);
return 0;
case WM_PAINT:
hdc=GetDC(hWnd);
//hMain=CreateCompatibleDC(NULL);
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,10,10,strScroll,lstrlen(strScroll));
GetHandle1(jpeg[ii],hWnd,hdc);//画像の読み込み
if(flgx==1 && flgy==1){//右から左の場合&&下から上の場合
StretchBlt( hdc, sx-xep1, sy-yep1,bitmap.bmWidth,bitmap.bmHeight*2,hMain, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}else if(flgx==2 && flgy==1){//左から右の場合&&下から上の場合
StretchBlt( hdc, sx+xep2, sy-yep1,bitmap.bmWidth,bitmap.bmHeight*2,hMain, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}else if(flgx==1 && flgy==2){//右から左の場合&&上から下の場合
StretchBlt( hdc, sx-xep1, sy+yep2,bitmap.bmWidth,bitmap.bmHeight*2,hMain, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}else if(flgx==2 && flgy==2){//左から右の場合&&上から下の場合
StretchBlt( hdc, sx+xep2, sy+yep2,bitmap.bmWidth,bitmap.bmHeight*2,hMain, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}else{//
StretchBlt( hdc, sx, sy,bitmap.bmWidth*2,bitmap.bmHeight,hMain, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
DeleteDC(hMain);
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}