用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.   

    就你的第一个问题,我猜想的,是不是可以更改hWndST的Z-Order来解决,你可以尝试一下
      

  2.   

    第二个问题出在CopyDCToBitmap函数上从dc只能得到看到的部分,其实就是屏幕上的点,没有显示出来的部分是的不到的
      

  3.   

    谢谢各位的帖子.可以更改hWndST的Z-Order来解决——能否说的详细一些?
    从dc只能得到看到的部分,其实就是屏幕上的点,没有显示出来的部分是的不到的——那我应该用什么办法来解决?麻烦给点意见。
      

  4.   

    看了楼上几位的,有些道理,
    第一个问题:
    你在WM_SIZE消息里面处理你的各个窗口的大小调整,这种方法应该是对的,至于为什么会出现这个问题,我在SDK下面没有用过,不过可以试试!!
    第二个问题:
    bobob(静思--潜心研究PDF)说的应该是对的。
    我在SDK下面还没有这么用过,如果楼主放心,可以发一分邮件给我:[email protected]
    我看看,能不能解决,我也不说多了,有些东西要实验出来了才有舒服力!!!
      

  5.   

    各位,给个解决的方法啊.Z order怎么改变啊????
      

  6.   

    对于第一个问题,你可以在wm_size响应里,设定窗口的最小值,当窗口小于设定的最小值,则什么都不做。对于第二个问题,我的想法是:现在内存中设定一个图像内存,每次在窗口中画图同时在内存中的图像一起被画。保存图像时,只要保存内存中的图像即可,这样既可保存了。