掌握VC++ 2008 Express开发软件。掌握Windows SDK程序设计方法。掌握wxWidgets类库在Windows平台的使用。学习跨平台的wxWidgets类库。阅读全文>
发表于 @ 2009年02月09日 23:26:00 | 评论( loading... ) | 举报| 收藏
1、培养目标l 程序设计入门,懂得怎么使用C++编写简单程序。l 掌握程序设计方法,领会面向过程、面向对象和模板的程序设计。l 熟练地使用C++解决问题。l 每个人看懂1000个例子源码。阅读全文>
发表于 @ 2008年06月16日 23:57:00 | 评论( loading... ) | 举报| 收藏
PALETTE_Init函数是用来创建系统调色板。具体实现如下:
#001 HPALETTE FASTCALL PALETTE_Init(VOID)
#002 {
#003 int i;
#004 HPALETTE hpalette;
#005 PLOGPALETTE palPtr;
#006 #ifndef NO_MAPPING
#007 PALOBJ *palObj;
#008 #endif
#009
创建系统20种缺省的颜色。
#010 // create default palette (20 system
colors)
分配20种颜色的调色板占用的内存空间。
#011 palPtr = ExAllocatePoolWithTag(PagedPool,
#012 阅读全文>
发表于 @ 2010年02月09日 23:09:00 | 评论( loading... ) | 举报| 收藏
系统调色板相关功能的代码在文件subsys/win32k/eng/palette.c里。什么是调色板呢?其实调色板就是当一种图像不是使用到所有颜色时,使用的一种索引技术,以便减少图像保存的大小。一幅图像,如果要按真彩色表达,那么就是256×256×256颜色;如果按256色表示,那就只使用到256个颜色,比起真彩色来说是少了很多空间。把一幅图像里所有包括的颜色生成一张表格,这张表格就叫做调色板。图像保存的数据时并不保存颜色的真实值,而是保存调色板里的索引值。
#001 typedef struct tagLOGPALETTE {
#002 WORD
palVersion;
#003 WORD
palNumEntries;
#004 PALETTEENTRY
palPalEntry[1];
#005 }
LOGPALETTE,*NPLOGPALETTE,*PLOGPALETTE,*LPLOGPALETTE;
这个结构,就是ROS的逻辑调色板结构定义。阅读全文>
发表于 @ 2010年02月08日 21:39:00 | 评论( loading... ) | 举报| 收藏
GetPixel函数是从指定DC里获取指定位置的颜色值。
#001 COLORREF
#002 WINAPI
#003 GetPixel( HDC hDC, INT x, INT y )
#004 {
如果句柄不是DC,就返回非法的。
#005 if (GDI_HANDLE_GET_TYPE(hDC) !=
GDI_OBJECT_TYPE_DC) return CLR_INVALID;
#006 if (!GdiIsHandleValid((HGDIOBJ) hDC)) return
CLR_INVALID;
调用函数NtGdiGetPixel返回指定颜色值。
#007 return NtGdiGetPixel( hDC, x, y);
#008 }阅读全文>
发表于 @ 2010年02月07日 10:35:00 | 评论( loading... ) | 举报| 收藏
SelectObject函数是将对象选定到指定的设备场境中。具体实现代码如下:
#001 HGDIOBJ
#002 WINAPI
#003 SelectObject(HDC hDC,
#004 HGDIOBJ hGdiObj)
#005 {
#006 PDC_ATTR pDc_Attr;
#007 HGDIOBJ hOldObj = NULL;
#008 UINT uType;
#009 //
PTEB pTeb;
#010
获取这个HDC相关的属性。
#011 if(!GdiGetHandleUserData(hDC,
GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
#012 {
#013 SetLastError(ERROR_INVALID_HANDLE);阅读全文>
发表于 @ 2010年02月06日 20:52:00 | 评论( loading... ) | 举报| 收藏
NtGdiCreateBitmap函数是创建一个位图句柄。
#001 HBITMAP APIENTRY
#002 NtGdiCreateBitmap(
#003 INT Width,
#004 INT Height,
#005 UINT Planes,
#006 UINT BitsPixel,
#007 IN
OPTIONAL LPBYTE pUnsafeBits)
Width是位图宽度。
Height是位图高度。
Planes是位图中颜色面的数目。
BitsPixel是标识单个像素的颜色所需的位数。
pUnsafeBits是指向由字节组成的数组的指针,该数组中包含像素数据。矩形中每条扫描线都必须字对齐。
#008 {
#009 if (pUnsafeBits)
#010 {
测试读取应用程序的数据是阅读全文>
发表于 @ 2010年02月05日 21:33:00 | 评论( loading... ) | 举报| 收藏
CreateBitmap函数是创建具有给定宽度、高度和颜色格式的、以颜色位值构成的数组为基础的位图。
#001 HBITMAP WINAPI
#002 CreateBitmap(INT Width,
#003 INT Height,
#004 UINT Planes,
#005 UINT BitsPixel,
#006 PCVOID pUnsafeBits)
#007 {
#008 /* FIXME some part should be done in user
mode */
#009 if (Width && Height)
#010 {
如果有宽度和高度,就调用内核函数NtGdiCreateBitmap来创建位图。
#011 return NtGdi阅读全文>
发表于 @ 2010年02月04日 21:23:00 | 评论( loading... ) | 举报| 收藏
GetDC函数是通过窗口的句柄获取设备环境,这样就可以把获取到的设备环境使用到后面的GDI函数里,这样就可以在窗口的客户区中绘图了。当应用程序结束时,需要使用ReleaseDC来释放设备环境。如果是私有设备时,就可以不删除它。这个API实现函数如下:
#001 EXTINLINE HDC WINAPI
#002 GetDC(HWND hWnd)
#003 {
这里调用函数NtUserGetDC来实现相应的功能。
#004 return NtUserGetDC(hWnd);
#005 }
NtUserGetDC函数是在内核WIN32K里实现的,如下:
#001 HDC APIENTRY
#002 NtUserGetDC(HWND hWnd)
#003 {
#004 DPRINT("NtUGetDC -> %x:%x\n", hWnd, !hWnd ? DCX_CACHE | DCX_WINDOW : DCX_US阅读全文>
发表于 @ 2010年02月02日 22:43:00 | 评论( loading... ) | 举报| 收藏
DC(device context)是一个图形对象、图形属性和影响图形输出的集合结构体。CreateDC函数用给定名称为指定的设备创建设备环境。CreateDC一般用于创建打印机的设备环境,也可以用来得到屏幕(硬件屏幕,而不是窗口的客户区)的设备环境。请小心使用这个函数,因为它允许应用程序在屏幕上任何位置绘图,而不仅仅是在窗口的边界内。请用GetDC或BeginPaint来获取屏幕窗口的设备环境。
#001 HDC
#002 WINAPI
#003 CreateDCW (
#004 LPCWSTR lpwszDriver,
#005 LPCWSTR lpwszDevice,
#006 LPCWSTR lpwszOutput,
#007 CONST
DEVMODEW *lpInitData
#008 )
#009 {
#010 阅读全文>
发表于 @ 2010年01月31日 17:36:00 | 评论( loading... ) | 举报| 收藏
开发操作系统是一个比较复杂的程序开发,调试和测试是一个极其大的任务,工作量很大,那么有什么方法来简化测试呢?尽量把问题找出来呢?在Reactos里是编写了很多API测试程序,也就是针对某一方面的API进行全面的测试。由于Reactos里是共享了很多WINE的API代码,所以它的API测试程序就叫做winetests工程。通过编写特定的API函数来测试,可以把一个一个的API测试出来,而不会导致多API相互出现的问题,比较难找,也比较难定位出现问题的代码所在。如果一个测试程序把所有的API都调用了,那意味着就需查找300万行代码,才能解决所有问题。如果使用的测试程序只调用一个API,那就简单了,只需要查找与这个API相关的代码,就可以找到出错地方了。因此,测试程序就是针对特定API的测试,这样才能提高开发的速度,查找BUG的速度。如果没有这些测试程序是很难开发一个这么大的操作系统的。
为了测试Reactos,以及开发Reactos,那么就需要下载它的测试代码。通过下面的方式来下载代码:
1. 第一步先要安装RosBE开发阅读全文>
发表于 @ 2010年01月30日 23:46:00 | 评论( loading... ) | 举报| 收藏
随着全球化的发展,开发软件都是面向多语言的环境。目前大多数程序都是采用不同字体来显示不同语言的办法,那么有没有一种更好的办法,一种字体就可以解决全球语言的显示呢?答案肯定的,它就是采用逻辑字体MS
Shell Dlg和MS
Shell Dlg2。比如开发应用程序时,就看到在资源里可以设置MS
Shell Dlg和MS
Shell Dlg2作为字体,并且可以设置不同的语言标识号,这样一个应用程序里就可以包括N种语言的资源,当这个应用程序运行在不同本地化设置地区时,操作系统就可以根据当前语言标识号去查找应用程序里的资源,如果找到一致的语言标识时就可以使用这种资源来显示。这时操作系统,就会使用注册表里标记为MS
Shell Dlg和MS
Shell Dlg2相对应的字体文件作为应用程序里的文字显示出来。ReactOS里就是使用这种方式来显示中文界面的。可以看到ReactOS注册表里如下:
70
[Font.CJK.Reg]
71 HKLM,"SOFTWARE\Microsoft\Windows
NT\CurrentVersio阅读全文>
发表于 @ 2010年01月27日 21:46:00 | 评论( loading... ) | 举报| 收藏
要调试内核代码是一件不容易的事情,一般是需要双机调试的方法,一台电脑作为目标机器来运行编译出来的操作系统,另一台电脑作为跟踪调试的机器,用来查看操作系统输出的调试信息、以及输入命令给操作系统。现在就来介绍基于虚拟机的方式来调试内核代码,最简单的方式就是使用串口通讯的方式,并且串口设置为零调制方式,也就是说只需要把数据线接收和发送交叉连续就可以了。假如在物理的电脑里有两个串口,分别命名为COM1和COM3,那么就可以在虚拟机里使用COM1作为输出串口,然后拿一条交叉的串口线把物理串口COM1和COM3连接起来,再打开串口程序并且连接串口COM3,那么就可以显示操作系统输出的信息,也可以输入命令给虚拟机操作系统了。交叉的串口线如下图所示:DTE1_______________________________________________DTE
29pol
25pol (female)__________________________25pol 9pol (female)5 7
---GND-----阅读全文>
发表于 @ 2010年01月24日 14:44:00 | 评论( loading... ) | 举报| 收藏
在ReactOS系统里,当安装完成后,如果网络已经可能使用,就可以立即打开应用程序管理器,直接从网络上下载相应的应用程序,这样是很方便安装和管理软件,这些都是跟Linux操作系统学习过来的。具体的界面如下:
这是ReactOS 0.3.11版本的界面,从上面看到可以下载很多非常有用的应用程序,包括最常用的网络浏览器。这一个版本改进是比较大的,很多功能已经完成,就差稳定性了。阅读全文>
发表于 @ 2010年01月23日 22:20:00 | 评论( loading... ) | 举报| 收藏
GreExtTextOutW函数实现一串字符串输出到指定区域,当然是从字符串变成图片输出。这些都调用FreeType库来实现的,具体实现代码如下:
#001 BOOL
#002 APIENTRY
#003 GreExtTextOutW(
#004 IN
HDC hDC,
#005 IN
INT XStart,
#006 IN
INT YStart,
#007 IN
UINT fuOptions,
#008 IN
OPTIONAL LPRECT lprc,
#009 IN
LPWSTR String,
#010 IN
INT Count,
#011 IN
OPTIONAL LPINT Dx,
#012 IN
DWORD dwCodePage)
#013 {
#014 /*
#015 阅读全文>
发表于 @ 2010年01月21日 21:26:00 | 评论( loading... ) | 举报| 收藏
UserDrawCaptionText函数实现窗口上标题的显示。实现的代码如下:
#001 BOOL
#002 UserDrawCaptionText(HDC hDc,
#003 const PUNICODE_STRING Text,
#004 const LPRECT lpRc,
#005 UINT uFlags)
#006 {
#007 HFONT hOldFont = NULL,
hFont = NULL;
#008 COLORREF OldTextColor;
#009 NONCLIENTMETRICSW nclm;
#010 NTSTATUS Status;
#011 #ifndef NDEBUG
#012 INT i;
#013 DPRINT("%s:", __FUNCTION__);
#014 for(i = 0; 阅读全文>
发表于 @ 2010年01月20日 23:44:00 | 评论( loading... ) | 举报| 收藏
UserDrawCaption函数是用来实现窗口标题显示。具体代码如下:
#001 BOOL UserDrawCaption(
#002 PWINDOW_OBJECT pWnd,
#003 HDC hDc,
#004 LPCRECT lpRc,
#005 HFONT hFont,
#006 HICON hIcon,
#007 const PUNICODE_STRING str,
#008 UINT uFlags)
#009 {
#010 BOOL Ret = FALSE;
#011 HBITMAP hMemBmp = NULL, hOldBmp = NULL;
#012 HBRUSH hOldBrush = NULL;
#013 HDC hMemDc = NULL;
#014 ULONG Height;
#015 阅读全文>
发表于 @ 2010年01月18日 21:34:00 | 评论( loading... ) | 举报| 收藏