用SDK做类似windows自带的画板程序有四个窗口,一个主窗口(hwnd),一个工具条(hWndTB),一个状态栏(hWndST),还有一个用于画图的子窗口(hWndChild).先确定hWndChild长宽为512*384,打开时按位图的长宽改变hWndChild的长宽.我现在遇到的问题是:
1.在WM_SIZE定位各个窗口的位置时,如果主窗口很小,用于画图的子窗口会遮盖住状态栏.
2.打开->修改->保存时,如是位图的长宽大于(hWndChild)长宽时,保存下来的位图长宽与原位图长宽一致,但是把超出hWndChild部分的主窗口外的图像保存了下来.
程序的思路是:打开时从DIB到DDB,得到hBitmap,修改过程中对hBitmap修改,保存时再从DDB到DIB(用函数CopyDCtoBitmap实现).我觉得是hWndChild出了问题,不知道应该怎么改.各位帮帮忙,如果光看上面的描述不清楚,我可以源程序发过去,改好了100分相送啊.
case WM_SIZE:
cxClient=(short)LOWORD (lParam) ;
cyClient=(short)HIWORD (lParam) ;
DibWidth=DIBWidth(szFileName);
DibHeight=DIBHeight(szFileName);
if(DibHeight==0||DibWidth==0)
{
DibHeight=384;
DibWidth=512;
}
if(DibHeight<cyClient)
MoveWindow(hWndChild,0,prt->top,DibWidth,DibHeight,TRUE);
else
MoveWindow(hWndChild,0,prt->top,cxClient,cyClient-prt->bottom-prt->top,TRUE);
MoveWindow(hWndTB,0,0,cxClient,prt->top,TRUE);
MoveWindow(hWndST,0,cyClient-prt->bottom,cxClient,prt->bottom,TRUE);
return 0;
(其中prt->top、prt->bottom分别的工具栏和状态栏的高)*****************************************************************************************
HBITMAP CopyDCToBitmap(HDC hSrc,int x1,int y1,int x2,int y2)
{
HBITMAP hBitmap,hOldBitmap;
HDC hMemDC;
int nWidth,nHeight;
nWidth=x2-x1;
nHeight=y2-y1; hMemDC=CreateCompatibleDC(hSrc);
hBitmap=CreateCompatibleBitmap(hSrc,nWidth,nHeight);
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
StretchBlt(hMemDC,0,0,nWidth,nHeight,hSrc,x1,y1,nWidth,nHeight,SRCCOPY);
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
return hBitmap;
}
hdc=GetDC(hWndChild);
hBitmap=CopyDCToBitmap(hdc,0,0,DibWidth,DibHeight);
ReleaseDC(hWndChild,hdc);
*****************************************************************************************
1.在WM_SIZE定位各个窗口的位置时,如果主窗口很小,用于画图的子窗口会遮盖住状态栏.
2.打开->修改->保存时,如是位图的长宽大于(hWndChild)长宽时,保存下来的位图长宽与原位图长宽一致,但是把超出hWndChild部分的主窗口外的图像保存了下来.
程序的思路是:打开时从DIB到DDB,得到hBitmap,修改过程中对hBitmap修改,保存时再从DDB到DIB(用函数CopyDCtoBitmap实现).我觉得是hWndChild出了问题,不知道应该怎么改.各位帮帮忙,如果光看上面的描述不清楚,我可以源程序发过去,改好了100分相送啊.
case WM_SIZE:
cxClient=(short)LOWORD (lParam) ;
cyClient=(short)HIWORD (lParam) ;
DibWidth=DIBWidth(szFileName);
DibHeight=DIBHeight(szFileName);
if(DibHeight==0||DibWidth==0)
{
DibHeight=384;
DibWidth=512;
}
if(DibHeight<cyClient)
MoveWindow(hWndChild,0,prt->top,DibWidth,DibHeight,TRUE);
else
MoveWindow(hWndChild,0,prt->top,cxClient,cyClient-prt->bottom-prt->top,TRUE);
MoveWindow(hWndTB,0,0,cxClient,prt->top,TRUE);
MoveWindow(hWndST,0,cyClient-prt->bottom,cxClient,prt->bottom,TRUE);
return 0;
(其中prt->top、prt->bottom分别的工具栏和状态栏的高)*****************************************************************************************
HBITMAP CopyDCToBitmap(HDC hSrc,int x1,int y1,int x2,int y2)
{
HBITMAP hBitmap,hOldBitmap;
HDC hMemDC;
int nWidth,nHeight;
nWidth=x2-x1;
nHeight=y2-y1; hMemDC=CreateCompatibleDC(hSrc);
hBitmap=CreateCompatibleBitmap(hSrc,nWidth,nHeight);
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
StretchBlt(hMemDC,0,0,nWidth,nHeight,hSrc,x1,y1,nWidth,nHeight,SRCCOPY);
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
return hBitmap;
}
hdc=GetDC(hWndChild);
hBitmap=CopyDCToBitmap(hdc,0,0,DibWidth,DibHeight);
ReleaseDC(hWndChild,hdc);
*****************************************************************************************
解决方案 »
- 简单问题 关于多线程入口函数 不知道自己的理解对不对?
- 再问:关于矢量文件(求教求教)
- 请大家帮帮忙!!!
- 关闭ToolBar的时候,为什么不触发OnClose()?
- 测试IOCP的问题,出现10061的错误?(在线等待)
- 急求高手[WORD]
- 我不结贴, 信 誉 值: 97 又要下跌了,可是大家给我一个结贴的理由好吗?
- 我在vc++.net编了一个DOS控制台程序, 但copy到其它计算机后就不能用(只有一个exe文件), 其它计算机没有装VC++, 请问如何解决?
- 发点牢骚:VC是良种马,BCB是杂种马!
- 关于DAO在数据库中插入位置的问题
- 请问vc如何访问linux下的某个需要认证文件目录?
- 哪位有现成的毕业设计全文?
从dc只能得到看到的部分,其实就是屏幕上的点,没有显示出来的部分是的不到的——那我应该用什么办法来解决?麻烦给点意见。
第一个问题:
你在WM_SIZE消息里面处理你的各个窗口的大小调整,这种方法应该是对的,至于为什么会出现这个问题,我在SDK下面没有用过,不过可以试试!!
第二个问题:
bobob(静思--潜心研究PDF)说的应该是对的。
我在SDK下面还没有这么用过,如果楼主放心,可以发一分邮件给我:[email protected]
我看看,能不能解决,我也不说多了,有些东西要实验出来了才有舒服力!!!