`
edgar108
  • 浏览: 33456 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

SWT源码分析(四)

阅读更多

接上文。

 

同理,shell.setSize(200, 100);方法最后调用的是OS.SetWindowPos函数设置窗口的位置:


 

窗口现在创建完了,还要显示和更新,现在进入shell.open()方法:

 

public void open () {
	checkWidget ();
	STARTUPINFO lpStartUpInfo = Display.lpStartupInfo;
	if (lpStartUpInfo == null || (lpStartUpInfo.dwFlags & OS.STARTF_USESHOWWINDOW) == 0) {
		bringToTop ();
		if (isDisposed ()) return;
	}
	......
	setVisible (true);
	......
}

 在进入setVisible(boolean visible)方法:

 

public void setVisible (boolean visible) {
	checkWidget ();
        .......
	int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
	if ((style & mask) != 0) {
		if (visible) {
			display.setModalShell (this);
			if ((style & (SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL)) != 0) {
				display.setModalDialog (null);
			}
			Control control = display._getFocusControl ();
			if (control != null && !control.isActive ()) {
				bringToTop ();
				if (isDisposed ()) return;
			}
			int /*long*/ hwndShell = OS.GetActiveWindow ();
			if (hwndShell == 0) {
				if (parent != null) hwndShell = parent.handle;
			}
			if (hwndShell != 0) {
				OS.SendMessage (hwndShell, OS.WM_CANCELMODE, 0, 0);
			}
			OS.ReleaseCapture ();
		} else {
			display.clearModal (this);
		}
	} else {
		updateModal ();
	}
	.......
	super.setVisible (visible);
        .......
	

}

 又调用了父类Decorations的setVisble(boolean visible)方法:

 

public void setVisible (boolean visible) {
	checkWidget ();
	if (!getDrawing()) {
		if (((state & HIDDEN) == 0) == visible) return;
	} else {
		if (visible == OS.IsWindowVisible (handle)) return;
	}
	if (visible) {
		/*
		* It is possible (but unlikely), that application
		* code could have disposed the widget in the show
		* event.  If this happens, just return.
		*/
		sendEvent (SWT.Show);
		if (isDisposed ()) return;
		if (OS.IsHPC) {
			if (menuBar != null) {
				int /*long*/ hwndCB = menuBar.hwndCB;
				OS.CommandBar_DrawMenuBar (hwndCB, 0);
			}
		}
		if (!getDrawing()) {
			state &= ~HIDDEN;
		} else {
			if (OS.IsWinCE) {
				OS.ShowWindow (handle, OS.SW_SHOW);
			} else {
				if (menuBar != null) {
					display.removeBar (menuBar);
					OS.DrawMenuBar (handle);
				}
				STARTUPINFO lpStartUpInfo = Display.lpStartupInfo;
				if (lpStartUpInfo != null && (lpStartUpInfo.dwFlags & OS.STARTF_USESHOWWINDOW) != 0) {
					OS.ShowWindow (handle, lpStartUpInfo.wShowWindow);
				} else {
					OS.ShowWindow (handle, swFlags);
				}
			}
			if (isDisposed ()) return;
			opened = true;
			if (!moved) {
				moved = true;
				Point location = getLocation ();
				oldX = location.x;
				oldY = location.y;
			}
			if (!resized) {
				resized = true;
				Rectangle rect = getClientArea ();
				oldWidth = rect.width;
				oldHeight = rect.height;
			}
			/*
			* Bug in Windows.  On Vista using the Classic theme, 
			* when the window is hung and UpdateWindow() is called,
			* nothing is drawn, and outstanding WM_PAINTs are cleared.
			* This causes pixel corruption.  The fix is to avoid calling
			* update on hung windows.  
			*/
			boolean update = true;
			if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0) && !OS.IsAppThemed ()) {
				update = !OS.IsHungAppWindow (handle);
			}
			if (update) OS.UpdateWindow (handle);
		}
	} else {
		if (!OS.IsWinCE) {
			if (OS.IsIconic (handle)) {
				swFlags = OS.SW_SHOWMINNOACTIVE;
			} else {
				if (OS.IsZoomed (handle)) {
					swFlags = OS.SW_SHOWMAXIMIZED;
				} else {
					swFlags = OS.SW_SHOWNOACTIVATE;
				}
			}
		}
		if (!getDrawing()) {
			state |= HIDDEN;
		} else {
			OS.ShowWindow (handle, OS.SW_HIDE);
		}
		if (isDisposed ()) return;
		sendEvent (SWT.Hide);
	}
}

 这个方法里面OS.ShowWindow和OS.UpdateWindow都有了。我是在OS类中的ShowWindow和UpdateWindow方法上加了断点,然后通过运行的上下文找到的~

 

如果去掉程序中的shell.open();这行代码,程序运行没问题,但是不会显示窗口。

 

到现在,一个windows程序中的注册、创建、显示、更新窗口,消息循环我们都在SWT程序中找到对应的代码了。还差一个窗口过程函数没找到。这个难度大一些,我力争分析出来,下次继续。

 

 

未完待续。

  • 大小: 40.5 KB
分享到:
评论

相关推荐

    SWT源码 swt.jar

    SWT源码的获取和分析对于开发者来说非常有价值,因为它可以深入理解其工作原理,自定义组件或优化应用程序。 "swt.jar"文件是SWT库的二进制版本,包含了运行SWT应用所需的类和资源。这个jar包通常会被Java项目引用...

    图书馆管理系统SWT源码

    《图书馆管理系统SWT源码详解》 在信息技术领域,开发高效、用户友好的管理软件是提升工作效率的关键。本文将深入探讨一个特别的案例——“图书馆管理系统”,该系统采用SWT(Standard Widget Toolkit)进行设计,...

    SWT API 帮助文档 及源码

    **源码分析** SWT 的源码是用Java编写的,通过JNI(Java Native Interface)与操作系统底层交互。通过阅读源码,开发者可以深入理解SWT的工作原理,学习如何与本地系统进行通信,以及如何优化GUI性能。源码中包含了...

    SWT内嵌火狐浏览器源码

    5. **源码分析与使用**: 源码中可能包含了如何初始化和控制SWT_Browser实例,如何加载和导航网页,以及如何处理JavaScript与Java之间的交互的示例代码。开发者可以通过学习和理解这些源码,了解如何在自己的项目中...

    eclipse swt项目源代码

    源代码对于学习和理解SWT和JFace的工作原理极其有用,开发者可以通过阅读源码学习如何使用这些库,或者进行二次开发。 6. `about_files`:这个目录可能包含了Eclipse关于对话框显示的其他资源文件,如图标、语言...

    swt源代码有兴趣的朋友不能错过哦!呵呵,好东西哦!

    通过分析这些源代码,开发者可以了解SWT如何与操作系统进行底层交互,实现高效、原生的GUI效果。这对于希望优化SWT性能、定制特定功能或者学习GUI编程原理的开发者来说,是非常宝贵的资料。如果你对SWT感兴趣,那么...

    Java SWT 简单 拼图 游戏 源码

    Java SWT(Standard Widget Toolkit)是Java编程环境中...通过学习和分析这个源码,你可以深入理解Java SWT的用法,以及如何结合算法实现一个完整的桌面应用程序。此外,对于游戏设计和用户交互也有一定的学习价值。

    Kettle 4.4.2源码分析.docx

    Kettle 4.4.2源码分析 Kettle 是一款功能强大且流行的数据 Integrator 工具,它提供了多种数据处理和Integration 功能。本文档将对 Kettle 4.4.2 的源码进行分析,从源码获取和编译到修改 Kettle 界面和启动测试等...

    eclipse swt/jface 核心应用源码

    掌握它们的使用和源码分析能力,对于提升 Java GUI 开发技能和参与 Eclipse RCP 应用的开发具有重要意义。通过深入研究提供的源码,开发者可以更好地优化自己的代码,实现更加高效和用户友好的界面。

    JAVA CS SWT RCP 在线升级 自动更新 源码

    5. **源码分析**:在提供的压缩包中,`com.cxd.zxsj`、`com.cxd.zxsj.feature`和`com.cxd.zxsj.update`可能分别代表了项目的主代码包、功能描述文件和更新相关配置。`com.cxd.zxsj`可能是应用程序的主要代码结构,...

    SWT-JFace Code源码

    通过分析这些源码,开发者可以学习到如何实际应用 SWT 和 JFace 创建高效、美观的 GUI 应用。例如,Chapter09可能介绍了布局管理,包括如何使用GridLayout、FillLayout等;Chapter13可能涉及事件处理和监听器;...

    SWT Tree 完整的树例子源码

    首先,我们来分析给定的文件列表: 1. `otree.css`: 这个文件是CSS样式表,用于定义SWT Tree的外观和布局,如字体、颜色、边框等。在创建树形结构时,可以利用CSS定制节点的样式,使其更具视觉吸引力。 2. `otree....

    SWT扩展

    源码分析** 对于SWT的深入学习,阅读源码是一个有效的途径。了解SWT如何与操作系统进行交互,以及如何实现各种控件和功能,可以帮助开发者更好地优化应用性能,解决特定问题。 在实际项目中,SWT常用于开发桌面...

    SWT开发

    7. **源码阅读**:了解SWT源码有助于深入理解其工作机制,解决性能问题或自定义组件。 8. **开发工具**:Eclipse是主要的SWT开发环境,提供代码补全、调试、布局编辑等功能。除此之外,还有SWTBot用于自动化测试,...

    swt

    博客链接中的内容可能涉及对SWT源码的分析。SWT作为一个开源项目,其源码对于开发者来说是一个宝贵的资源,可以深入理解其内部工作机制,学习如何与操作系统进行交互,以及如何优化GUI性能。通过阅读源码,开发者...

    kettle4.1源码分析

    Kettle4.1 是该工具的一个版本,其源码分析有助于深入理解其内部工作原理,便于自定义开发或优化。 在开始源码分析之前,首先需要获取和编译 Kettle4.1 的源码。这可以通过 SVN 从官方仓库中下载,网址为 svn://...

    Java+SWT+图形用户界面教程+PDFJava源码

    通过分析和运行这些代码,你可以深入理解SWT的API和组件使用方式,以及如何将它们整合到Java应用程序中。 SWT提供了一系列的控件,包括按钮、文本框、列表、树、表格等,这些都可以用来构建各种复杂的用户界面。...

    JAVA SWT 多标签浏览器

    JAVA SWT 多标签浏览器是一种利用Java编程语言和SWT(Standard Widget Toolkit)库构建...通过分析源码,开发者可以学习到如何利用SWT创建原生外观的应用,以及如何实现复杂的用户交互功能,比如多标签导航和书签管理。

    以SWT为界面,用POI读取、修改excel文件(源码)

    标题中的“以SWT为界面,用POI读取、修改excel文件(源码)”指的是一个Java编程项目,它利用了两种主要的技术:SWT(Standard Widget Toolkit)和Apache POI,来创建用户界面并处理Microsoft Excel文件。下面将详细...

Global site tag (gtag.js) - Google Analytics