reactos操作系统实现(180)

DefWndNCPaint函数实现窗口非客户区的显示部分,比如窗口的标题、最大化、最小化、关闭按钮、滚动条等等。

#001  LRESULT

#002  DefWndNCPaint(HWND hWnd, HRGN hRgn, BOOL Active)

#003  {

#004     HDC hDC;

#005     DWORD Style, ExStyle;

#006     HWND Parent;

#007     RECT ClientRect, WindowRect, CurrentRect, TempRect;

#008 

 

如果窗口不可见,就不用进行显示操作。

#009     if (!IsWindowVisible(hWnd))

#010        return 0;

#011 

 

获取窗口的类型。

#012     Style = GetWindowLongW(hWnd, GWL_STYLE);

#013 

 

获取窗口的设备。

#014     hDC = GetDCEx(hWnd, hRgn, DCX_WINDOW | DCX_INTERSECTRGN | DCX_USESTYLE | DCX_KEEPCLIPRGN);

#015     if (hDC == 0)

#016     {

#017        return 0;

#018     }

#019 

 

获取父窗口。

#020     Parent = GetParent(hWnd);

 

获取窗口扩展类型。

#021     ExStyle = GetWindowLongW(hWnd, GWL_EXSTYLE);

 

判断当前窗口是否为有焦点的窗口。

#022     if (Active == -1)

#023     {

#024        if (ExStyle & WS_EX_MDICHILD)

#025        {

#026           Active = IsChild(GetForegroundWindow(), hWnd);

#027           if (Active)

#028              Active = (hWnd == (HWND)SendMessageW(Parent, WM_MDIGETACTIVE, 0, 0));

#029        }

#030        else

#031        {

#032           Active = (GetForegroundWindow() == hWnd);

#033        }

#034     }

 

获取窗口的位置和大小。

#035     GetWindowRect(hWnd, &WindowRect);

 

获取窗口客户区的大小。

#036     GetClientRect(hWnd, &ClientRect);

#037 

 

计算窗口的大小。

#038     CurrentRect.top = CurrentRect.left = 0;

#039     CurrentRect.right = WindowRect.right - WindowRect.left;

#040     CurrentRect.bottom = WindowRect.bottom - WindowRect.top;

#041 

 

如果窗口有边沿类型,就需要画边沿窗口。

#042     /* Draw outer edge */

#043     if (UserHasWindowEdge(Style, ExStyle))

#044     {

 

显示窗口的边沿线。

#045        DrawEdge(hDC, &CurrentRect, EDGE_RAISED, BF_RECT | BF_ADJUST);

#046     } else

#047     if (ExStyle & WS_EX_STATICEDGE)

#048     {

 

显示固定边沿线。

#049  #if 0

#050        DrawEdge(hDC, &CurrentRect, BDR_SUNKENINNER, BF_RECT | BF_ADJUST | BF_FLAT);

#051  #else

#052        SelectObject(hDC, GetSysColorBrush(COLOR_BTNSHADOW));

#053        PatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, 1, PATCOPY);

#054        PatBlt(hDC, CurrentRect.left, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#055 

#056        SelectObject(hDC, GetSysColorBrush(COLOR_BTNHIGHLIGHT));

#057        PatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, 1, PATCOPY);

#058        PatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#059 

#060        InflateRect(&CurrentRect, -1, -1);

#061  #endif

#062     }

#063 

 

显示窗口细边框的样式。

#064     /* Firstly the "thick" frame */

#065     if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE))

#066     {

#067        DWORD Width =

#068           (GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME)) *

#069           GetSystemMetrics(SM_CXBORDER);

#070        DWORD Height =

#071           (GetSystemMetrics(SM_CYFRAME) - GetSystemMetrics(SM_CYDLGFRAME)) *

#072           GetSystemMetrics(SM_CYBORDER);

#073 

#074        SelectObject(hDC, GetSysColorBrush(Active ? COLOR_ACTIVEBORDER :

#075           COLOR_INACTIVEBORDER));

#076 

#077        /* Draw frame */

#078        PatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, Height, PATCOPY);

#079        PatBlt(hDC, CurrentRect.left, CurrentRect.top, Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#080  #ifdef __REACTOS__

#081        PatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, -Height, PATCOPY);

#082        PatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, -Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#083  #else

#084        PatBlt(hDC, CurrentRect.left, CurrentRect.bottom, CurrentRect.right - CurrentRect.left, -Height, PATCOPY);

#085        PatBlt(hDC, CurrentRect.right, CurrentRect.top, -Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#086  #endif

#087 

#088        InflateRect(&CurrentRect, -Width, -Height);

#089     }

#090 

 

显示框架部分。

#091     /* Now the other bit of the frame */

#092     if (Style & (WS_DLGFRAME | WS_BORDER) || ExStyle & WS_EX_DLGMODALFRAME)

#093     {

#094        DWORD Width = GetSystemMetrics(SM_CXBORDER);

#095        DWORD Height = GetSystemMetrics(SM_CYBORDER);

#096  

#097        SelectObject(hDC, GetSysColorBrush(

#098           (ExStyle & (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE)) ? COLOR_3DFACE :

#099           (ExStyle & WS_EX_STATICEDGE) ? COLOR_WINDOWFRAME :

#100           (Style & (WS_DLGFRAME | WS_THICKFRAME)) ? COLOR_3DFACE :

#101           COLOR_WINDOWFRAME));

#102 

#103        /* Draw frame */

#104        PatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, Height, PATCOPY);

#105        PatBlt(hDC, CurrentRect.left, CurrentRect.top, Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#106  #ifdef __REACTOS__

#107        PatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, -Height, PATCOPY);

#108        PatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, -Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#109  #else

#110        PatBlt(hDC, CurrentRect.left, CurrentRect.bottom, CurrentRect.right - CurrentRect.left, -Height, PATCOPY);

#111        PatBlt(hDC, CurrentRect.right, CurrentRect.top, -Width, CurrentRect.bottom - CurrentRect.top, PATCOPY);

#112  #endif

#113 

#114        InflateRect(&CurrentRect, -Width, -Height);

#115     }

#116 

 

当窗口有标题时,就需要显示标题,也就是显示窗口最顶端的字符串。

#117     /* Draw caption */

#118     if ((Style & WS_CAPTION) == WS_CAPTION)

#119     {

#120        DWORD CaptionFlags = DC_ICON | DC_TEXT | DC_BUTTONS;

#121        HPEN PreviousPen;

#122        BOOL Gradient = FALSE;

#123 

#124        if(SystemParametersInfoW(SPI_GETGRADIENTCAPTIONS, 0, &Gradient, 0) && Gradient)

#125        {

#126          CaptionFlags |= DC_GRADIENT;

#127        }

#128 

#129        TempRect = CurrentRect;

#130 

#131        if (Active)

#132        {

#133           CaptionFlags |= DC_ACTIVE;

#134        }

#135 

 

如果是工具条窗口,就需要显示窗口标题为比较小。

#136        if (ExStyle & WS_EX_TOOLWINDOW)

#137        {

#138           CaptionFlags |= DC_SMALLCAP;

#139           TempRect.bottom = TempRect.top + GetSystemMetrics(SM_CYSMCAPTION) - 1;

#140           CurrentRect.top += GetSystemMetrics(SM_CYSMCAPTION);

#141        }

#142        else

#143        {

#144           TempRect.bottom = TempRect.top + GetSystemMetrics(SM_CYCAPTION) - 1;

#145           CurrentRect.top += GetSystemMetrics(SM_CYCAPTION);

#146        }

#147 

 

下面调用函数NtUserDrawCaption来显示窗口标题。

#148        NtUserDrawCaption(hWnd, hDC, &TempRect, CaptionFlags);

#149 

 

下面显示系统的菜单按钮。

#150        /* Draw buttons */

#151        if (Style & WS_SYSMENU)

#152        {

#153           UserDrawCaptionButton(&TempRect, Style, ExStyle, hDC, FALSE, DFCS_CAPTIONCLOSE);

#154           if ((Style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX)) && !(ExStyle & WS_EX_TOOLWINDOW))

#155           {

#156              UserDrawCaptionButton(&TempRect, Style, ExStyle, hDC, FALSE, DFCS_CAPTIONMIN);

#157              UserDrawCaptionButton(&TempRect, Style, ExStyle, hDC, FALSE, DFCS_CAPTIONMAX);

#158           }

#159        }

#160        if(!(Style & WS_MINIMIZE))

#161        {

#162          /* Line under caption */

#163          PreviousPen = SelectObject(hDC, GetSysColorPen(

#164             ((ExStyle & (WS_EX_STATICEDGE | WS_EX_CLIENTEDGE |

#165                          WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE) ?

#166             COLOR_WINDOWFRAME : COLOR_3DFACE));

#167          MoveToEx(hDC, TempRect.left, TempRect.bottom, NULL);

#168          LineTo(hDC, TempRect.right, TempRect.bottom);

#169          SelectObject(hDC, PreviousPen);

#170        }

#171     }

#172 

#173     if(!(Style & WS_MINIMIZE))

#174     {

#175       HMENU menu = GetMenu(hWnd);

#176       /* Draw menu bar */

#177       if (menu && !(Style & WS_CHILD))

#178       {

#179          TempRect = CurrentRect;

#180          TempRect.bottom = TempRect.top + (UINT)NtUserSetMenuBarHeight(menu, 0);

#181          CurrentRect.top += MenuDrawMenuBar(hDC, &TempRect, hWnd, FALSE);

#182       }

#183 

 

显示客户区边界。

#184       if (ExStyle & WS_EX_CLIENTEDGE)

#185       {

#186          DrawEdge(hDC, &CurrentRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);

#187       }

#188 

 

显示窗口的滚动条。

#189       /* Draw the scrollbars */

#190       if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) &&

#191           IntIsScrollBarVisible(hWnd, OBJID_VSCROLL) && IntIsScrollBarVisible(hWnd, OBJID_HSCROLL))

#192       {

#193          RECT ParentClientRect;

#194 

#195          TempRect = CurrentRect;

#196          if (ExStyle & WS_EX_LEFTSCROLLBAR)

#197             TempRect.right = TempRect.left + GetSystemMetrics(SM_CXVSCROLL);

#198          else

#199             TempRect.left = TempRect.right - GetSystemMetrics(SM_CXVSCROLL);

#200          TempRect.top = TempRect.bottom - GetSystemMetrics(SM_CYHSCROLL);

#201          FillRect(hDC, &TempRect, GetSysColorBrush(COLOR_BTNFACE));

#202          /* FIXME: Correct drawing of size-box with WS_EX_LEFTSCROLLBAR */

#203          if(Parent)

#204            GetClientRect(Parent, &ParentClientRect);

#205          if (HASSIZEGRIP(Style, ExStyle, GetWindowLongW(Parent, GWL_STYLE), WindowRect, ParentClientRect))

#206          {

#207             DrawFrameControl(hDC, &TempRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);

#208          }

#209          IntDrawScrollBar(hWnd, hDC, SB_VERT);

#210          IntDrawScrollBar(hWnd, hDC, SB_HORZ);

#211       }

#212       else

#213       {

#214          if (Style & WS_VSCROLL && IntIsScrollBarVisible(hWnd, OBJID_VSCROLL))

#215             IntDrawScrollBar(hWnd, hDC, SB_VERT);

#216          else if (Style & WS_HSCROLL && IntIsScrollBarVisible(hWnd, OBJID_HSCROLL))

#217             IntDrawScrollBar(hWnd, hDC, SB_HORZ);

#218       }

#219     }

#220 

#221     ReleaseDC(hWnd, hDC);

#222 

#223     return 0;

#224  }

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值