求教问题 窗口分成五个区域 lpSize出错

waxmqq 2011-12-10 01:01:10
Run-Time Check Failure #3 - The variable 'lpSize' is being used without being initialized.



下面是程序全部代码

// text3.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "text3.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TEXT3, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEXT3));

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEXT3));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEXT3);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hDC;
WORD x,y;
HCURSOR hCursor; //定义光标句柄.
HBRUSH hBrush;
LPSIZE lpSize; //窗口尺寸结构.
static char cLeftBtn[]="LEFT BUTTON"; //定义单击左键时的输出字符.
static char cRightBtn[]="RIGHT BUTTON"; //定义单击右键时的输出字符.
RECT ClientRect;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
GetClientRect(hWnd,&ClientRect); //得到窗口大小
if(y>=0&&y<=ClientRect.bottom)
{
if(y>=0&&y<=ClientRect.bottom/5) //在此区域,是箭头.
{
hCursor=LoadCursor(NULL,IDC_ARROW);
SetCursor(hCursor);
}
else if(y>=ClientRect.bottom/5&&y<=ClientRect.bottom/5*2) //在此区域为十字图标.
{
hCursor=LoadCursor(NULL,IDC_CROSS);
SetCursor(hCursor);
}
else if(y>=ClientRect.bottom/5*2&&y<=ClientRect.bottom/5*3) //在此区域为东北西南方向的箭头光标.
{
hCursor=LoadCursor(NULL,IDC_SIZENESW);
SetCursor(hCursor);
}
else if(y>=ClientRect.bottom/5*3&&y<=ClientRect.bottom/5*4) //在此区域为西北东南方向的箭头光标.
{
hCursor=LoadCursor(NULL,IDC_SIZENS);
SetCursor(hCursor);
}
else //在此区域为等待光标.
{
hCursor=LoadCursor(NULL,IDC_WAIT);
SetCursor(hCursor);
}
}
return 0;
case WM_LBUTTONDOWN: //单击左建.
hDC=GetDC(hWnd); //得到设备环境指针.
SetBkColor(hDC,RGB(255,255,0)); //设置背景色.
TextOut(hDC,0,0,cLeftBtn,strlen(cLeftBtn)); //输出.
ReleaseDC(hWnd,hDC); //释放设备环境指针.
break;
case WM_RBUTTONDOWN: //单击右建.
hDC=GetDC(hWnd); //得到设备环境指针.
SetBkColor(hDC,RGB(255,255,0)); //设置背景色.
TextOut(hDC,0,0,cRightBtn,strlen(cRightBtn)); //输出.
ReleaseDC(hWnd,hDC); //释放设备环境指针.
break;
case WM_SIZE:
hDC=GetDC(hWnd); //得到设备环境指针.
SetMapMode(hDC,MM_ANISOTROPIC); //设置映象模式.
SetViewportExtEx(hDC,LOWORD(lParam),HIWORD(lParam),lpSize); //设置试口区域.
SetWindowExtEx(hDC,100,50,lpSize); //设置窗口区域.

hBrush=CreateSolidBrush(RGB(255,255,255)); //定义白画刷.
SelectObject(hDC,hBrush); //选入白画刷.
Rectangle(hDC,0,0,100,10); //填充矩形
DeleteObject(hBrush); //删除画刷.

hBrush=CreateSolidBrush(RGB(0,255,0)); //定义绿画刷.
SelectObject(hDC,hBrush); //选入绿画刷.
Rectangle(hDC,0,10,100,20); //填充矩形.
DeleteObject(hBrush); //删除画刷.

hBrush=CreateSolidBrush(RGB(0,0,255)); //定义蓝画刷.
SelectObject(hDC,hBrush); //选入蓝画刷.
Rectangle(hDC,0,20,100,30); //填充矩形.
DeleteObject(hBrush); //删除画刷.

hBrush=CreateSolidBrush(RGB(255,255,0)); //定义黄画刷.
SelectObject(hDC,hBrush); //选入黄画刷.
Rectangle(hDC,0,30,100,40); //填充矩形.
DeleteObject(hBrush); //删除画刷.

hBrush=CreateSolidBrush(RGB(255,0,0)); //定义红画刷.
SelectObject(hDC,hBrush); //选入红画刷.
Rectangle(hDC,0,40,100,50); //填充矩形.
DeleteObject(hBrush); //删除画刷.

ReleaseDC(hWnd,hDC); //删除设备环境指针.
break;
case WM_DESTROY: //处理退出窗口信息.
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,message,wParam,lParam));
}
return 0;
}


// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
...全文
141 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
waxmqq 2011-12-11
  • 打赏
  • 举报
回复
谢谢各位!!
schlafenhamster 2011-12-11
  • 打赏
  • 举报
回复
你给lpSize一个值:
SIZE sz;
sz.x=400;
sz.y=200;
SetViewportExtEx(hDC,LOWORD(lParam),HIWORD(lParam),&sz); //设置试口区域.
Eleven 2011-12-11
  • 打赏
  • 举报
回复
Run-Time Check Failure #3 - The variable 'lpSize' is being used without being initialized.
------------
没有给它初始化,给它个初始值试试~
lumingming 2011-12-11
  • 打赏
  • 举报
回复
这个分割的按我的例子。多百度一下应该不难的哟楼主
lumingming 2011-12-11
  • 打赏
  • 举报
回复
客户区窗口动态分割示例
分类: MFC 2011-03-03 19:44 36人阅读 评论(0) 收藏 举报
1.定义CSplitterWnd类型变量
在MainFrm.h文件中加入如下代码:
protected:
CSplitterWnd m_wndSplitter;
定义Splitter变量用于分割客户区窗口,本例中将客户区分割为两列一行。
2.构建分割后各分区的视图
本例中构建一个CTreeView视图和CFormView视图
(1)Insert->New Class..构建Base class为CTreeView文件名称为MyTreeView的树视图;
(2)在资源视图中添加对话框资源,右击->Properties->Style:Child,Border:None。右击->ClassWizard...创建类名为:CMyFormView,Base class:CFormView的视图。
需要注意的是,基于CTreeView和CFormView的视图类向导自动添加了两个允许视图运行时创建的两个宏:DECLARE_DYNCREATE(CMyTreeView)和IMPLEMENT_DYNCREATE(CMyTreeView, CTreeView),前者一般声明在头文件构造函数下方,后者声明在源文件构造函数实现代码上方。如若使得继承与CDialog类的对话框资源也可以运行时创建,就需要在类文件中分别添加这两个宏。
3.构建分割视图
在MainFrm.cpp文件中的OnCreateClient()函数中添加如下构建分割视图的代码:
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyTreeView),CSize(200,100),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyFormView),CSize(100,100),pContext);
RUNTIME_CLASS即执行运行时创建。
4.分别为TreeViw和FormView添加初始化及用户所需代码
对于FormView由于对应的是对话框资源,其相关操作与对话框操作类似。下面主要分析TreeView。
.cpp文件中初始化代码:
void CMyTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
m_pCtrTree = &GetTreeCtrl();//获取视图的CTreeCtrl控件便于以后操作
(CWnd*)m_pCtrTree->ModifyStyle(0,TVS_LINESATROOT| TVS_EDITLABELS |TVS_HASBUTTONS |TVS_HASLINES ,0);

/*m_list 为CImageList对象IDB_TREE 为16*(16*4)的位图,每个图片为16*16共4个图标*/
m_list.Create(IDB_TREE,16,4,RGB(0,0,0));
m_pCtrTree->SetImageList(&m_list,TVSIL_NORMAL);

HTREEITEM hItem,hSubItem;
hItem = m_pCtrTree->InsertItem("Windows 资源管理器",0,1,TVI_ROOT);//在根结点上添加

hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem);//在根结点上添加一个子结点
hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem,hSubItem);//在根结点上添加一个子结点,排在上面的子节点后面
hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem,hSubItem);
hItem = m_pCtrTree->InsertItem("文件夹",2,2,TVI_ROOT,hItem);
hItem = m_pCtrTree->InsertItem("文件夹",3,3,TVI_ROOT,hItem);

}
5.两视图间交互操作
交互主要是数据的交互,有两种解决方式:一种是以Document为中间媒介,数据 都有Document进行管理,方便实现数据交互;二是通过MainFrm中定义的CSplitterWnd变量在本视图中获取另一视图的指针,并作强制 类型转换成其对应视图变量后,访问视图中的数据。本例采用第二种方式。
void CMyTreeView::OnMouseMove(UINT nFlags, CPoint point)
{
CMainFrame* Wnd1 = (CMainFrame*)AfxGetMainWnd();//首先获取主框架

CString str;
str.Format("x = %d,y = %d ",point.x,point.y);
CWnd* m_pWndFormView;
m_pWndFormView= Wnd1 ->m_wndSplitter.GetPane( 0, 1 );//由主框架中m_wndSplitter变量获取FormView.
((CMyFormView*)(m_pWndFormView))->m_edit = str;//设置FormView中变量的值

((CMyFormView*)(m_pWndFormView))->UpdateData(FALSE);//更新显示数据

CTreeView::OnMouseMove(nFlags, point);
}
6.编译运行结果
如图:



waxmqq 2011-12-10
  • 打赏
  • 举报
回复
就是想知道怎么解决·····新手 求帮助
schlafenhamster 2011-12-10
  • 打赏
  • 举报
回复
The variable 'lpSize' is being used without being initialized
没初始化:
SetViewportExtEx(hDC,LOWORD(lParam),HIWORD(lParam),lpSize); //设置试口区域.
SetWindowExtEx(hDC,100,50,lpSize); //设置窗口区域.

16,472

社区成员

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

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

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