Windows界面编程第二篇 半透明窗体 代码求助

_静以修身 研发工程师  2013-02-05 11:06:38
消息循环始终未能收到WM_INITDIALOG消息。初学,不明白原因,特来求助。。

程序运行收到的第一个消息为 #define WM_SETFONT 0x0030
第二个消息为 #define WM_DESTROY 0x0002
第三个消息为 #define WM_NCDESTROY 0x0082
之后程序就结束了。

源代码博客链接地址http://blog.csdn.net/morewindows/article/details/8451632
编译环境VS2008

沙发贴代码
...全文
216 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wocow3 2013-02-05
main里先注册控件类 InitCommonControls();
  • 打赏
  • 举报
回复
jimette 2013-02-05
创建一个模态对话框! cdialog dlg dlg。domoadl!
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-05
对话框里 有些 什么 ?
  • 打赏
  • 举报
回复
_静以修身 2013-02-05

// TransparentWindow.cpp : Defines the entry point for the application.
//
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

const char szDlgTitle[] = "可变透明度窗体 MoreWindows-(http://blog.csdn.net/MoreWindows)";

// 对话框消息处理函数
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return 0;
}


BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	const int INIT_TRANSPARENT = 200; //窗体初始透明度
	static HBRUSH    s_hBitmapBrush; //位图画刷

	switch (message)
	{
	case WM_INITDIALOG:
		// 设置对话框标题
		SetWindowText(hDlg, szDlgTitle);

		// 加载背影图片
		HBITMAP hBitmap;
		hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		if (hBitmap == NULL)
		{
			MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);
			exit(0);
		}		

		// 创建位图画刷
		s_hBitmapBrush = CreatePatternBrush(hBitmap);

		// 设置分层属性
		SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
		// 设置透明度 0 - completely transparent   255 - opaque
		SetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA);

		// 设置滑动条变化范围
		SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255));
		// 设置滑块初始位置
		SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT);
		return 0;


	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDCANCEL:
			DeleteObject(s_hBitmapBrush);
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;


	case WM_HSCROLL: // slider control 滑块位置有变化时的响应函数
		{
			// 获取当前滑块位置
			int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0); 
			// 设置新透明度
			SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);
		}
		break;


	case WM_CTLCOLORDLG:  //对话框背影
		return (BOOL)s_hBitmapBrush;
	}
	return FALSE;
}
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 12 楼 schlafenhamster 的回复:
link 中加入 “comctl32.lib”
哈哈 搞定了 谢谢
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-05
link 中加入 “comctl32.lib”
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 10 楼 schlafenhamster 的回复:
连接 lib
能说明白一点吗?不知道什么意思啊。 下载的源码里好像也没有lib文件啊
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-05
连接 lib
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 8 楼 wocow3 的回复:
引用 7 楼 lossed1990 的回复:引用 4 楼 wocow3 的回复:main里先注册控件类 InitCommonControls(); 总要先init对话框吧。。为什么没有WM_INITDIALOG这消息? 没有注册控件类,DialogBox创建子窗口失败,到不了WM_INITDIALOG slide control需要调用InitCommon……
无法解析的外部符号 __imp__InitCommonControlsEx@4,该符号在函数 _WinMain@16 中被引用 头文件我引用了啊#include <commctrl.h>
  • 打赏
  • 举报
回复
wocow3 2013-02-05
引用 7 楼 lossed1990 的回复:
引用 4 楼 wocow3 的回复:main里先注册控件类 InitCommonControls(); 总要先init对话框吧。。为什么没有WM_INITDIALOG这消息?
没有注册控件类,DialogBox创建子窗口失败,到不了WM_INITDIALOG slide control需要调用InitCommonControlsEx,查下msdn找slide的ICC注册
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 4 楼 wocow3 的回复:
main里先注册控件类 InitCommonControls();
总要先init对话框吧。。为什么没有WM_INITDIALOG这消息?
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 3 楼 sha_jinhao 的回复:
创建一个模态对话框! cdialog dlg dlg。domoadl!
不明白什么意思
  • 打赏
  • 举报
回复
_静以修身 2013-02-05
引用 2 楼 schlafenhamster 的回复:
对话框里 有些 什么 ?
就一个slider control
  • 打赏
  • 举报
回复
相关推荐
发帖
界面
加入

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2013-02-05 11:06
社区公告
暂无公告