windows编程-两个窗口穿参数,指针数据丢失

问题描述

两个窗口穿参数,指针数据丢失

在头文件里面声明了一个
struct Param
{
BITMAPINFO *pinfo;
BYTE *pbit;
DWORD h;
DWORD w;
};结构体
程序绝大部分如下
#include "stdafx.h"
#include
#include
#include "resource.h"
#include "MainDlg.h"
#include "SHOWDLG.h"
#include
#include

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}

 return FALSE;

}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
HWND chuli=GetDlgItem(hwnd,IDC_chuli);
ComboBox_InsertString(chuli,-1,TEXT("傅里叶变换"));
ComboBox_InsertString(chuli,-1,TEXT("什么二值化"));
ComboBox_InsertString(chuli,-1,TEXT("获取边缘梯度图像"));
ComboBox_InsertString(chuli,-1,TEXT("还有什么阈值"));
return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
HWND chuli=GetDlgItem(hwnd,IDC_chuli);
int n;
OPENFILENAME ofn;
char szFile[MAX_PATH];
DWORD m_nHeight, m_nWidth;
HWND h_static=GetDlgItem(hwnd,IDC_s);
HDC hdc_static=GetDC(h_static);
Param params;

 switch(id)
 {
     case IDC_OK://为什么不能开同一张图片两次?

{
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = TEXT("ALL*.*Text*.TXTBMP*.bmpJPG*.jpg");
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('');//艹,不加这一句还打不开,不明所以
ofn.nFilterIndex = 3;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;

ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn))
{
if(3==ofn.nFilterIndex)
{
MessageBox(hwnd,ofn.lpstrFile,TEXT("问好"),MB_OK);
HANDLE Hbmp=CreateFile(ofn.lpstrFile,GENERIC_READ |GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE m_Hbmp=CreateFileMapping(Hbmp,NULL,PAGE_READWRITE,0,0x1400000,TEXT("maptest"));
if( INVALID_HANDLE_VALUE==m_Hbmp)
{
MessageBox(hwnd,TEXT("映像创建失败"),TEXT("error"),MB_OK);
return;
}
LPVOID lpBase = MapViewOfFile(m_Hbmp, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//params = lpBase;
BITMAPFILEHEADER pFileHeader;
BITMAPINFO *pInfoHeader;
pFileHeader = (BITMAPFILEHEADER
)lpBase;
BYTE pBits = (BYTE)lpBase + pFileHeader->bfOffBits;
pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER));
m_nHeight = pInfoHeader->bmiHeader.biHeight;
m_nWidth = pInfoHeader->bmiHeader.biWidth;
HBITMAP hBitmap = CreateCompatibleBitmap(hdc_static, m_nWidth, m_nHeight);
SelectObject(hdc_static, hBitmap);
params.w = m_nWidth;
params.h = m_nHeight;
params.pinfo = pInfoHeader;//结构体指针的赋值有问题
params.pbit = pBits;
int nRet = SetDIBitsToDevice(hdc_static,0,0,m_nWidth,m_nHeight,0,0,0,m_nHeight,pBits,pInfoHeader,DIB_RGB_COLORS);
InvalidateRect((HWND)Hbmp, NULL, TRUE);
DeleteObject(hBitmap);
ReleaseDC(hwnd,hdc_static);
//UnmapViewOfFile(lpBase);
CloseHandle(m_Hbmp);

}

}

}
break;
case IDC_DOIT:
{
n=ComboBox_GetCurSel(chuli);
HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
while(n<0)
{
MessageBox(hwnd,TEXT("请选择处理方式"),TEXT("提示"),MB_OKCANCEL);
break;
}
if(n<0)
{
break;
}

switch(n)
{
//LPARAM par;
//par=(long
)&params;
case 0:
{
DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,(long)&params);
MessageBox(NULL,TEXT("傅里叶变换"),TEXT("你选择了"),MB_OK);

}
break;
case 1:
{
MessageBox(NULL,TEXT("什么二值化"),TEXT("你选择了"),MB_OK);
DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300);
}
break;
case 2:
{
MessageBox(NULL,TEXT("获取边缘梯度图像"),TEXT("你选择了"),MB_OK);
DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300);
}
break;
case 3:
{
MessageBox(NULL,TEXT("还有什么阈值"),TEXT("你选择了"),MB_OK);
DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300);
}
break;
default:
break;

}
}
break;
default:
break;
}
}

void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}
然后在另一个窗口函数里面
BOOL SHOWDLG_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
Param * pa = (Param*)lParam ;//DC没有问题,传进来的指针指的地方不对
SetDIBitsToDevice(h_sdc,0,0,pa->w,pa->h,0,0,0,pa->h,pa->pbit,pa->pinfo,DIB_RGB_COLORS);
return TRUE;
}
调试发现在红色标记语句执行后params里面的数据丢失(之前调试看的数据都正常),这句UnmapViewOfFile(lpBase);不释放就好了,但是传递给另一个窗口的时候结构体里面的数据就全没了,定义全局变量也没用,现在想做的就是在两个窗口里面都显示同一个图片,以后再做图像处理,小弟都是自学的,MFC不太熟悉,想请各位大神指教一下,感激不尽!

时间: 2024-08-28 16:15:28

windows编程-两个窗口穿参数,指针数据丢失的相关文章

windows编程 全屏窗口的创建总结 .

from:http://blog.csdn.net/leolee82/article/details/6992615 windows编程 全屏窗口的创建总结第一种:较简单的方法在ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);前加如下代码: [cpp] view plaincopyprint? LONG style = GetWindowLong(hwnd,GWL_STYLE);//获得窗口风格    style = &~WS_CAPTION 

窗口风格-windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式?

问题描述 windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式? 最近在学习Windows编程,看windows程序设计,但那个hellowin程序出来的窗口是可以拉伸的,怎样固定下来,让窗口不可以拉伸,应该是一个窗口样式或者风格,但老是查不出来,求助! 解决方案 WS_SIZEBOX WS_THICKFRAM 解决方案二: http://blog.csdn.net/diaolingle/article/details/17284711 解决方案三: WS_BORDER 0X00800

windows编程 在一个窗口上加载一个位图图片

问题描述 windows编程 在一个窗口上加载一个位图图片 希望前辈们能给个demo程序.或者最基本的窗口上加载一个位图图片就好,加载位图时用的LoadImage 初学windows编程,不太懂上下文设备,希望大神能给个例程,让我学习. 解决方案 c++windows编程加载图片 解决方案二: #include #include "resource.h" LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPA

浮动栏退出-windows编程 窗口全屏无边框时设置浮动栏(带有最小化按钮和退出按钮)退出全屏

问题描述 windows编程 窗口全屏无边框时设置浮动栏(带有最小化按钮和退出按钮)退出全屏 悬浮框的代码是参考freerdp实现的. 请指出错误或者提供解决代码,谢谢 //============================= #include #include "resource.h" typedef struct wf_context wfContext; typedef struct _Button Button; typedef struct _FloatBar Floa

网页播放器的参数含义 Windows Media Player 网页播放器 参数含义_网页播放器

(默认0为否,-1或1为是)<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" id="MediaPlayer1" width="286" height="225">   <param name="AudioStream" value="-1">   <param name="A

设备上下文-请问各位大神,Windows编程里边的DC(device context)到底是什么啊?

问题描述 请问各位大神,Windows编程里边的DC(device context)到底是什么啊? 请教各位大神,设备上下文(device context)到底是个什么东西?它仅仅是一个抽象概念还是一个实体概念(即有对应的代码)?它是一个结构体吗?如果它有对应的源码的话,怎么能找到?在下在网上找了很多资料,包括MSDN上的,但越看越糊涂.在下想了解关于它最本质的东西,在下怎么才能"看到它"?这个问题给在下带来很大困惑,希望大家为在下指点迷津,拜托大家了!在下先行谢过! 解决方案 DC实

c++-VC++与VC#的windows编程有区别吗??使用的类库一样吗??

问题描述 VC++与VC#的windows编程有区别吗??使用的类库一样吗?? VC++与VC#的windows编程有区别吗??使用的类库一样吗?? 比如这个里面的一些框架函数如Button等的使用相同吗? 解决方案 微软为C++做了一些扩展,搞出一种向下兼容C++,但是又有自己的语法以兼容.net的语言,叫C++/CLI(以前叫C++ ME,托管扩展) VC++/CLI可以同时支持MFC和.NET.但是事实上几乎没有人用,是很冷僻的技术. 相比较MFC,WinForms和WPF要好太多,C#也

c++-比较两个相等的函数里,当给两个不相等参数时,系统为什么会自动返回x的值呢??

问题描述 比较两个相等的函数里,当给两个不相等参数时,系统为什么会自动返回x的值呢?? int fun(int aint b){ if(a == b) { return a; }} void main(){ int x = 20y =10; int z = fun(xy); cout<<z<<endl;}fun函数里,没有给出,当两个参数不相等的返回情况,那么系统为什么会自动返回x的值呢??请各位大神帮帮我 解决方案 由于不相等时没有给定返回值,所以将返回栈顶值如果此时栈是空的,则

windows编程-windows 编程 新手问题

问题描述 windows 编程 新手问题 最近刚开始看windows 自学 就是想了解下,书中helloworld程序先注册了一个窗口类,然后写了一个窗口对象,再然后是消息的循环, 可是我没看懂窗口对象是怎么知道自己是属于这个窗口类的,并没有把窗口类的值赋给窗口对象啊, 消息也是,没看出这个消息与窗口是怎么建立关系的 求解答 解决方案 CreateWindow()的时候,可以指定窗口类