SetWindowLong设置窗口新过程

函数原型:LONG SetWindowLong(HWND hWnd,  int nIndex,  LONG dwNewLong);

主要说明函数的第二个参数为GWL_WNDPROC的情况。

GWL_WNDPROC

Sets a new address for the window procedure. You cannot change this attribute if the window does not belong to the same process as the calling thread.

例子:

WNDPROC pWindowProc = 0;
LRESULT CALLBACK CallWindProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);

void Ctest_HkDlg::OnBnClickedProc()
{
   pWindowProc = (WNDPROC)GetWindowLong(GetDlgItem(IDC_WND1)->m_hWnd, GWL_WNDPROC);     //保存原来的窗口过程
   LONG lValue = SetWindowLong(GetDlgItem(IDC_WND1)->m_hWnd,GWL_WNDPROC,(LONG)CallWindProc);
   if (lValue==0)
   {
      int lErr = GetLastError();
      char buf[32] = {0};
      sprintf_s(buf, 32,"gle = %d \r\n", lErr);
      OutputDebugString(buf);
   }
}

LRESULT CALLBACK CallWindProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) 
{  
   switch(message) 
   { 
   case WM_ACTIVATE: 
      break;
   case WM_NCACTIVATE:   
      break; 

  case WM_NCMOUSEMOVE: 
      break; 
   case WM_MOUSEMOVE: 
      break;
   case WM_SIZE: 
      break;   
   case WM_PAINT:
      break;
   } 
   if(pWindowProc)
      return (*pWindowProc)(hwnd, message, wparam, lparam);  //调用原来的窗口过程
   return DefWindowProc(hwnd, message, wparam, lparam);  //调用默认的窗口过程函数
}  

 

转载于:https://www.cnblogs.com/zhangzfan/p/4056745.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用SetWindowLong函数来给无边窗口增加边框。以下是一个示例代码: ```cpp #include <Windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_NCCALCSIZE: { // 获取窗口的边框尺寸 NCCALCSIZE_PARAMS* params = reinterpret_cast<NCCALCSIZE_PARAMS*>(lParam); params->rgrc[0].left += 4; params->rgrc[0].top += 4; params->rgrc[0].right -= 4; params->rgrc[0].bottom -= 4; return 0; } case WM_NCHITTEST: { // 设置鼠标在窗口边框上时显示调整大小的光标 LRESULT hit = DefWindowProc(hwnd, msg, wParam, lParam); if (hit == HTCLIENT) return HTBORDER; else return hit; } } return DefWindowProc(hwnd, msg, wParam, lParam); } int main() { // 创建窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX) }; wc.lpfnWndProc = WndProc; wc.hInstance = GetModuleHandle(nullptr); wc.lpszClassName = L"BorderWindow"; // 注册窗口类 RegisterClassEx(&wc); // 创建窗口 HWND hwnd = CreateWindowEx( 0, L"BorderWindow", L"无边框窗口", WS_POPUP | WS_VISIBLE, 100, 100, 400, 300, nullptr, nullptr, GetModuleHandle(nullptr), nullptr); // 设置窗口样式 LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE); SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_BORDER); // 消息循环 MSG msg; while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } ``` 在上述代码中,我们通过在窗口过程(WndProc)中处理WM_NCCALCSIZE和WM_NCHITTEST消息来实现给无边框窗口增加边框的效果。在WM_NCCALCSIZE消息中,我们修改窗口的边框尺寸,使得客户区(即窗口的工作区域)相应地减小。在WM_NCHITTEST消息中,我们设置鼠标在窗口边框上时显示调整大小的光标。 请注意,以上代码仅为示例,您可能需要根据自己的需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值