Win32 编程学习笔记

发布于 2023-05-04 21:59:15 字数 5036 浏览 44 评论 0

1、WIN32 控件加背景图片

case WM_PAINT:
{
  HBITMAP    hbm;
  BITMAP    bminfo;
  hbm = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
  GetObject(hbm, sizeof(bminfo), &bminfo);

  PAINTSTRUCT    ps;
  HDC dc = BeginPaint(hwndDlg, &ps);

  HDC    memdc = CreateCompatibleDC(dc);

  SelectObject(memdc, hbm);
  //    BitBlt(dc,0,0,bminfo.bmWidth,bminfo.bmHeight,memdc,0,0,SRCCOPY);
  ::StretchBlt(dc, 0, 0, 990, 404, memdc, 0, 0, bminfo.bmWidth, bminfo.bmHeight, SRCCOPY);
  DeleteDC(memdc);
  EndPaint(hwndDlg, &ps);
}
return TRUE;

2、WIN32 窗体半透明

#define WS_EX_LAYERED 0x00080000//扩展样式

#define WS_EX_LAYERED 0x00080000
hwnd = CreateWindowEx(WS_EX_LAYERED,
    lpszClassName,
    lpszTitle,
    WS_CAPTION | WS_SYSMENU,
    CW_USEDEFAULT, CW_USEDEFAULT,
    iWindowWidth, iWindowHeight,
    NULL,
    NULL,
    hInstance,
    NULL);

typedef BOOL(WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;
// 获取函数 SetLayeredWindowAttributes 在User32.dll中的指针
HMODULE hUser32 = GetModuleHandle("USER32.DLL");
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
(*g_pSetLayeredWindowAttributes)(hwnd, RGB(250, 0, 0), 215, 2);

注意:如果是从资源文件中创建的窗口,要在资源文件(*.rc)扩展样式中加上 |0x00080000

3、WIN32 修改窗体样式

int gwl_style=-16 ;
long oldstyle ;
oldstyle=GetWindowLong(hwndDlg,gwl_style);
SetWindowLong(hwndDlg,gwl_style,oldstyle|WS_EX_LAYERED);

4、按钮加背景图片

case WM_PAINT:
{
  HBITMAP    hbm;
  BITMAP    bminfo;
  hbm = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
  GetObject(hbm, sizeof(bminfo), &bminfo);

  PAINTSTRUCT    ps;
  HDC dc = BeginPaint(hwnd, &ps);

  HDC    memdc = CreateCompatibleDC(dc);

  SelectObject(memdc, hbm);
  BitBlt(dc, 0, 0, bminfo.bmWidth, bminfo.bmHeight, memdc, 0, 0, SRCCOPY);

  DeleteDC(memdc);

  EndPaint(hwnd, &ps);
  break;
}

5、COMBOX 控件下拉大小的设置

点击如图倒三角然后拖动边框

6、从 CodeBlocks 下的 GUI 程序移植到 VC 6.0 注意事项

要增加如下代码

// 开启视觉效果
#pragma comment(lib, "Comctl32.lib")
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
}

7、为控件设置文本

SetWindowText(GetDlgItem(hwndDlg, SETXONC), "0x13");
SetWindowText(GetDlgItem(hwndDlg, SETXOFFC), "0x19");
SetWindowText(GetDlgItem(hwndDlg, SETTO), "0");

8、WIN32 下 RadioBox 默认选中

SendDlgItemMessage(hwndDlg, RDCHAR, BM_SETCHECK, 1, 0); // 把RadioBox RDCHAR设置为选中

注意:在设置为默认选中的时候要把单选按钮(Radiobox)分组。 方法:把需要分组的按钮放到一个 groupbox 中,然后把其中的一个 RadioBox 的属性设为组

9、减小生成的 EXE 体积

#pragma comment (linker, "/OPT:NOWIN98")
//自定义函数入口
#pragma comment(linker, "/ENTRY:EntryPoint")
//自定义对齐方式

#pragma comment (linker, "/ALIGN:512")
#pragma comment(linker, "/FILEALIGN:512")

// 优化选项

#pragma comment(linker, "/opt:nowin98")
#pragma comment(linker, "/opt:ref")
#pragma comment (linker, "/OPT:ICF")

// 合并区段

#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")

10、判断 Radiobox 是否选中的方法

#define Button_GetCheck(hwndCtl)  ((int)(DWORD)SNDMSG((hwndCtl), BM_GETCHECK, 0L, 0L))
void CheckDisplayStation(HWND hwndDlg)
{
    UINT discheck;
    discheck = Button_GetCheck(GetDlgItem(hwndDlg, RDHEX));
    if (discheck == BST_CHECKED){//16进制显示
        DisplayHex(1);
    }
    if (discheck == BST_UNCHECKED){//字符显示
        DisplayHex(0);
    }
}

11、Combox 增加数据项

    SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("Cc"));

12、字符转16进制(对于单片机非常有用)

char szBuf[10]; // 缓存区
GetWindowText(GetDlgItem(hwndDlg, SDTEXT), szBuf, 10);
int t1, t2;
if ( // 过滤数据
  ((szBuf[0] >= 'A'&&szBuf[0] <= 'F') || (szBuf[0] >= 'a'&&szBuf[0]<'=f') || (szBuf[0] >= '0'&&szBuf[0] <= '9'))
  &&
  ((szBuf[1] >= 'A'&&szBuf[1] <= 'F') || (szBuf[1] >= 'a'&&szBuf[1] <= 'f') || (szBuf[1] >= '0'&&szBuf[1] <= '9'))
  ){
  if (szBuf[0] >= 'a'&&szBuf[0]<'=f'){//小写字母
    t1 = szBuf[0] - 87;
  }
  else if (szBuf[0] >= 48 && szBuf[0] <= 57){//数字
    t1 = szBuf[0] - 48;
  }
  else if (szBuf[0] >= 'A'&&szBuf[0] <= 'F')//大写字母
  {
    t1 = szBuf[0] - 55;
  }

  if (szBuf[1] >= 'a'&&szBuf[1]<'=f'){//小写字母
    t2 = szBuf[1] - 87;
  }
  else if (szBuf[1] >= 48 && szBuf[1] <= 57){//数字
    t2 = szBuf[1] - 48;
  }
  else{//大写字母
    t2 = szBuf[1] - 55;
  }
  SendChar(t1 * 16 + t2);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

懂王

文章 0 评论 0

清秋悲枫

文章 0 评论 0

niceone-tech

文章 0 评论 0

小伙你站住

文章 0 评论 0

刘涛

文章 0 评论 0

南街九尾狐

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文