创建了一个非模态对话框,却无法拖动,求解

IT保安 2015-02-03 02:11:36
代码:
// 标准的32位程序模板.cpp : Defines the entry point for the application.
//

// 滚动条设计.cpp : Defines the entry point for the application.
//


#include "stdafx.h"
#include <TCHAR.H>
#include <stdio.h>
#include "resource.h"

HWND hDlgModeless;
TCHAR* AppName = TEXT("MyWin");

LRESULT CALLBACK myWndproc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
bool CALLBACK ColorScrDlg(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
WNDCLASSEX wndclassex;
wndclassex.cbClsExtra = 0;
wndclassex.cbSize = sizeof(wndclassex);
wndclassex.cbWndExtra = 0;
wndclassex.hbrBackground = CreateSolidBrush(0L);
wndclassex.hCursor = NULL;
wndclassex.hIcon = NULL;
wndclassex.hIconSm = NULL;
wndclassex.hInstance = hInstance;
wndclassex.lpfnWndProc = myWndproc;
wndclassex.lpszClassName = AppName;
wndclassex.lpszMenuName = NULL;
wndclassex.style = CS_VREDRAW | CS_HREDRAW;

if(!RegisterClassEx(&wndclassex))
{
MessageBox(NULL,TEXT("RegisterClassEx Fails"),TEXT("Warning"),0);
}

HWND hWnd = CreateWindow(AppName,TEXT("Mywindow"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hDlgModeless = CreateDialog(hInstance,MAKEINTRESOURCE(COLORSCRDLG),hWnd,(DLGPROC)ColorScrDlg);

MSG uMsg;
while(GetMessage(&uMsg,NULL,0,0))
{
if(hDlgModeless == 0 || !IsDialogMessage(hDlgModeless,&uMsg))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
}

return 0;
}

LRESULT CALLBACK myWndproc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
int wId,wEvent;//WM_COMMAND的控件ID和通知码
static HINSTANCE hInstance;
switch(uMsg)
{
case WM_CREATE:
// hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
// hDlgModeless = CreateDialog(hInstance,TEXT("ColorScrDlg"),hwnd,(DLGPROC)ColorScrDlg);
return 0;
case WM_DESTROY:
DeleteObject((HGDIOBJ)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH)));
PostQuitMessage(0);
return 0;
case WM_CLOSE:
DestroyWindow(hwnd);
return 0;
case WM_PAINT:
return 0;
case WM_SIZE:
return 0;
case WM_VSCROLL:
return 0;
case WM_COMMAND:
wId = LOWORD(wParam);
wEvent = HIWORD(wParam);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
bool CALLBACK ColorScrDlg(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static int iColor[3];
int* p = iColor;
HWND hwndParent,hCtrl;
int iCtrlID,iIndex;
switch(uMsg)
{
case WM_INITDIALOG:
for(iCtrlID = 10;iCtrlID < 13;iCtrlID++)
{
hCtrl = GetDlgItem(hwnd,iCtrlID);
SetScrollRange(hCtrl,SB_CTL,0,255,false);
SetScrollPos(hCtrl,SB_CTL,0,false);
}
return true;
case WM_SYSCOMMAND:
switch(wParam)
{
case SC_CLOSE://关闭对话框
DestroyWindow(hwnd);
break;
}
return true;
case WM_VSCROLL:
hCtrl = (HWND)lParam;
iCtrlID = GetWindowLong(hCtrl,GWL_ID);
iIndex = iCtrlID - 10;
hwndParent = GetParent(hwnd);
switch(LOWORD(wParam))
{
case SB_PAGEDOWN:
iColor[iIndex] = min(iColor[iIndex] + 15,255);
break;
case SB_PAGEUP:
iColor[iIndex] = max(iColor[iIndex] - 15,0);
break;
case SB_LINEUP:
iColor[iIndex] = max(iColor[iIndex] - 1,0);
break;
case SB_LINEDOWN:
iColor[iIndex] = min(iColor[iIndex] + 1,255);
break;
case SB_TOP:
iColor[iIndex] = 0;
break;
case SB_BOTTOM:
iColor[iIndex] = 255;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
iColor[iIndex] = HIWORD(wParam);
break;
default:
return false;
}
SetScrollPos(hCtrl,SB_CTL,iColor[iIndex],true);
SetDlgItemInt(hwnd,iCtrlID + 3,iColor[iIndex],false);
DeleteObject((HGDIOBJ)SetClassLong(hwndParent,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(
RGB(iColor[0],
iColor[1],
iColor[2]))));
InvalidateRect(hwndParent,NULL,true);
//UpdateWindow(hwndParent);

return true;

}
return false;
}



rc:
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

COLORSCRDLG DIALOG DISCARDABLE 32, 32, 162, 162
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
FONT 10, "System"
BEGIN
LTEXT "&Red",IDC_STATIC,29,16,14,8
LTEXT "&Green",IDC_STATIC,72,16,21,8
LTEXT "&Blue",IDC_STATIC,115,16,14,8
SCROLLBAR IDC_SCROLLBAR1,27,30,18,97,SBS_VERT
SCROLLBAR IDC_SCROLLBAR2,70,30,18,97,SBS_VERT
SCROLLBAR IDC_SCROLLBAR3,113,30,18,97,SBS_VERT
LTEXT "0",IDC_STATIC1,29,133,14,8
LTEXT "0",IDC_STATIC2,72,133,14,8
LTEXT "0",IDC_STATIC3,115,133,14,8
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
COLORSCRDLG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 155
TOPMARGIN, 7
BOTTOMMARGIN, 155
END
END
#endif // APSTUDIO_INVOKED

#endif // Chinese (中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED



#define IDC_SCROLLBAR1                  10
#define IDC_SCROLLBAR2 11
#define IDC_SCROLLBAR3 12
#define IDC_STATIC1 13
#define IDC_STATIC2 14
#define IDC_STATIC3 15
#define COLORSCRDLG 102

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1006
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
...全文
185 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
beautyangus 2015-02-03
  • 打赏
  • 举报
回复
在 Windows 7 以及后面的操作系统里,拖动标题栏晃动窗口,会最小化其他窗口,这不是你代码的问题。
IT保安 2015-02-03
  • 打赏
  • 举报
回复
谢谢回复啦,我把 WM_SYSCOMMAND都给注释掉,对话框过程的结尾 return DefWindowProc(hwnd,uMsg,wParam,lParam);好像就解决了问题了! 现在对话框可以拖动了,但是一旦拖动,就会将其他的程序最小化,这是为什么?
beautyangus 2015-02-03
  • 打赏
  • 举报
回复
我花了 10s,找到两个重要的问题。 1.WM_PAINT 不应该直接就 return 掉,必须在处理 WM_PAINT 的时候进行 BeginPaint。 2.WM_SYSCOMMAND 是处理标题栏拖动等操作的,楼主直接 return true; 没有传递给 DefWndProc,标题栏当然无法拖动了。 ^_^

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧