user-0 提问: static控件怎么用

回复:
user: user-0
content: 引用 18 楼 Intel0011 的回复:你的代码好像没什么问题，你可以检查一下hwnd2和hbitmap的值是否有效 //* #define UNICODE #define _UNICODE //*/ #include <Windows.h> #include <tchar.h>  #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "user32.lib")  #pragma comment(linker, "/subsystem:windows")  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) {    static TCHAR szAppName[] = TEXT("HelloWin");    HWND         hwnd;    MSG          msg;    WNDCLASS     wndclass;        RtlZeroMemory(&wndclass, sizeof(wndclass));    wndclass.style         = CS_HREDRAW | CS_VREDRAW;    wndclass.lpfnWndProc   = WndProc;    wndclass.hInstance     = hInstance;    wndclass.hIcon         = LoadIcon(NULL, TEXT("#32512"));    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wndclass.lpszMenuName  = NULL;    wndclass.lpszClassName = szAppName;        if (!RegisterClass(&wndclass))    {       MessageBox(NULL, TEXT("This program requires Windows NT series!"), szAppName, MB_ICONERROR);       return -1;    }             hwnd = CreateWindowEx(WS_EX_APPWINDOW,// | WS_EX_COMPOSITED,            // A tool window does not appear in the task bar or in the window that appears when the user presses ALT+TAB.                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW,// | WS_HSCROLL | WS_VSCROLL,        // window style                          100,//CW_USEDEFAULT,              // initial x position                          100,//CW_USEDEFAULT,              // initial y position                          600,//CW_USEDEFAULT,              // initial x size                          480,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters     ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);          {       BOOL bRet;       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)       {          if (bRet == -1)          {             MessageBox(NULL, TEXT("GetMessage Error."), TEXT("Message"), MB_ICONERROR);             return -1;          }          else          {             TranslateMessage(&msg);             DispatchMessage(&msg);          }       }    }     UnregisterClass(szAppName, hInstance);    return msg.wParam; }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    static HWND    hStatic;    static HBITMAP hOldBitmap;    static HBITMAP	hBitmap;        switch (message)    {       case WM_CREATE:          hBitmap = (HBITMAP)LoadImage(NULL, TEXT("view.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);          hStatic = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE,                                  0, 0, 300, 300, hwnd, (HMENU)1, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);                   hOldBitmap = (HBITMAP)SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);          return 0;           case WM_DESTROY:          if (hOldBitmap)            {               DeleteObject(hOldBitmap);            }            DeleteObject(hBitmap);          PostQuitMessage(0);          return 0;    }    return DefWindowProc(hwnd, message, wParam, lParam); }  谢谢呀，之前我用hdc绘制了hbitmap，是没问题的，窗口句柄没试，应该也是没问题的，但就是出不来，奇怪的就是，今天又忽然可以了，昨天的代码也神奇地找不到了，怪事扎堆

user: user-0
content: 引用 5 楼 Intel0011 的回复: 可以给各静态控件显示位图的例子吗？我测试没成功，不会又要传hdc给父窗口绘制吧？ 我的是这样的：   HWND hwnd2 = CreateWindow("static","",WS_CHILD|WS_VISIBLE|SS_BITMAP,100,200,100,100,h,(HMENU)1,NULL,NULL); HBITMAP hbitmap = LoadImage( NULL, "1.bmp", 0, 0, 0, LR_LOADFROMFILE ); SendMessage( hwnd2, STM_SETIMAGE, 0, (LPARAM)hbitmap );

user: user-1
content: 你的代码好像没什么问题，你可以检查一下hwnd2和hbitmap的值是否有效 //* #define UNICODE #define _UNICODE //*/ #include <Windows.h> #include <tchar.h>  #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "user32.lib")  #pragma comment(linker, "/subsystem:windows")  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) {    static TCHAR szAppName[] = TEXT("HelloWin");    HWND         hwnd;    MSG          msg;    WNDCLASS     wndclass;        RtlZeroMemory(&wndclass, sizeof(wndclass));    wndclass.style         = CS_HREDRAW | CS_VREDRAW;    wndclass.lpfnWndProc   = WndProc;    wndclass.hInstance     = hInstance;    wndclass.hIcon         = LoadIcon(NULL, TEXT("#32512"));    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wndclass.lpszMenuName  = NULL;    wndclass.lpszClassName = szAppName;        if (!RegisterClass(&wndclass))    {       MessageBox(NULL, TEXT("This program requires Windows NT series!"), szAppName, MB_ICONERROR);       return -1;    }             hwnd = CreateWindowEx(WS_EX_APPWINDOW,// | WS_EX_COMPOSITED,            // A tool window does not appear in the task bar or in the window that appears when the user presses ALT+TAB.                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW,// | WS_HSCROLL | WS_VSCROLL,        // window style                          100,//CW_USEDEFAULT,              // initial x position                          100,//CW_USEDEFAULT,              // initial y position                          600,//CW_USEDEFAULT,              // initial x size                          480,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters     ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);          {       BOOL bRet;       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)       {          if (bRet == -1)          {             MessageBox(NULL, TEXT("GetMessage Error."), TEXT("Message"), MB_ICONERROR);             return -1;          }          else          {             TranslateMessage(&msg);             DispatchMessage(&msg);          }       }    }     UnregisterClass(szAppName, hInstance);    return msg.wParam; }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    static HWND    hStatic;    static HBITMAP hOldBitmap;    static HBITMAP	hBitmap;        switch (message)    {       case WM_CREATE:          hBitmap = (HBITMAP)LoadImage(NULL, TEXT("view.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);          hStatic = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE,                                  0, 0, 300, 300, hwnd, (HMENU)1, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);                   hOldBitmap = (HBITMAP)SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);          return 0;           case WM_DESTROY:          if (hOldBitmap)            {               DeleteObject(hOldBitmap);            }            DeleteObject(hBitmap);          PostQuitMessage(0);          return 0;    }    return DefWindowProc(hwnd, message, wParam, lParam); }

user: user-2
content: 引用 13 楼 六道佩恩 的回复:[quote=引用 12 楼 Intel0011 的回复:]C++ builder的升级版embarcadero https://www.embarcadero.com 原来dev也是他们的吗，才知道。。。[/quote]  因为dev-c++的ID E是用Delphi写的，而且是免费开源的（源码在github上），所以emb也就顺手开了一个分支，其实现存的dev-c++几个分支应该没有明显区别

user: user-0
content: 引用 12 楼 Intel0011 的回复:C++ builder的升级版embarcadero https://www.embarcadero.com 原来dev也是他们的吗，才知道。。。

user: user-2
content: 引用 11 楼 ooolinux 的回复:[quote=引用 8 楼 早打大打打核战争 的回复:]windows API的设计是80年代的水平，不要用现在的观念去评价它 操作系统的API一般都是纯C的吧，不可能像VCL这种类库这么易用？[/quote]  C库也有设计好坏之分，我的意思是windows API的设计水平不高

user: user-3
content: 要改变static控件的ID，不要使用默认的IDC_STATIC

user: user-4
content: 个人觉得SDK纯API方式编写Windows程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder 6.0几个示例程序项目源代码下载：       C++ Builder第一个程序（模拟聊天室）v1.11 C++ Builder模拟数字双时钟示例（未完成）v0.2.1 C++ Builder纸牌游戏Demo v0.03 C++ Builder不规则图像透明贴图（位图的透明显示）三种方法及简单动画v1.3 C++ Builder写的《ZEC 四则运算练习程序》 海底海星情景v0.9.2 C++ Builder简单电话簿Demo例子v1.11

user: user-1
content: C++ builder的升级版embarcadero https://www.embarcadero.com

user: user-4
content: 引用 8 楼 早打大打打核战争 的回复:windows API的设计是80年代的水平，不要用现在的观念去评价它 操作系统的API一般都是纯C的吧，不可能像VCL这种类库这么易用？

user: user-4
content: 引用 9 楼 六道佩恩 的回复:[quote=引用 7 楼 ooolinux 的回复:]个人觉得SDK纯API方式编写Windows程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。 好的，我试试，多谢推荐。请问这个有中文版的吗？ 这种可视化的C/C++工具还有推荐的吗? C++ builder和wxdev比如何？[/quote] 6.0有中文版的，高版本也有人汉化，但需要付费。6.0的书籍和资源比较多。 最容易入门的是C++Builder。Qt也不错，难度系数1.5倍。wxdev不了解，估计资料不多。 新版C++ Builder即RAD Studio还可以写安卓、苹果app，一套代码编译多平台，可以先编译为Windows版本方便调试和测试。

user: user-0
content: 引用 7 楼 ooolinux 的回复:个人觉得SDK纯API方式编写Windows程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。 好的，我试试，多谢推荐。请问这个有中文版的吗？ 这种可视化的C/C++工具还有推荐的吗? C++ builder和wxdev比如何？

user: user-2
content: windows API的设计是80年代的水平，不要用现在的观念去评价它

user: user-1
content: 引用 4 楼 六道佩恩 的回复:只是这个，还是用了它的HDC来重绘呀，，挺麻烦的呀，感觉没易语言的“标签”好用，它是类名是_EL_Label 没用过易语言，但你说的应该和Delphi差不多，这归功于库封装后才易于使用，是库的优势，但底层操作都是用HDC实现的。

user: user-0
content: 引用 5 楼 Intel0011 的回复:[quote=引用 4 楼 六道佩恩 的回复:] 只是这个，还是用了它的HDC来重绘呀，，挺麻烦的呀，感觉没易语言的“标签”好用，它是类名是_EL_Label 没用过易语言，但你说的应该和Delphi差不多，这归功于库封装后才易于使用，是库的优势，但底层操作都是用HDC实现的。 [/quote] 我只是觉得这个控件一开始的设计就有问题，如果是我设计的话，那么这些颜色的矩形就默认作为背景色来衬托文字，修改文字？发消息！修改背景色？发消息！用底图衬托？发消息！如果是希望得到纯色矩形或纯净底图，那直接让标题为空或者指定一个不显示标题的样式不就行了吗？一个控件只是简简单单显示一段文字都需要父窗口来重新绘制。。。。。

user: user-0
content: 引用 3 楼 Intel0011 的回复:    case WM_CTLCOLORSTATIC:       hdcStatic = (HDC)wParam;       SetTextColor(hdcStatic, RGB(0x41, 0x96, 0x4F)); //翠绿色       SetBkMode(hdcStatic, TRANSPARENT); //透明背景       return (INT_PTR)GetStockObject(NULL_BRUSH); //无颜色画刷  老哥你来啦，非常感谢来回答呀！  只是这个，还是用了它的HDC来重绘呀，，挺麻烦的呀，感觉没易语言的“标签”好用，它是类名是_EL_Label

user: user-1
content: #include <Windows.h> #include <tchar.h>  #pragma comment(lib, "gdi32") #pragma comment(lib, "user32")  #pragma comment(linker, "/subsystem:windows")  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) {    static TCHAR szAppName[] = TEXT("HelloWin");    HWND         hwnd;    MSG          msg;    WNDCLASS     wndclass;     RtlZeroMemory(&wndclass, sizeof(wndclass));    wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;    wndclass.lpfnWndProc   = WndProc;    wndclass.hInstance     = hInstance;    wndclass.hIcon         = LoadIcon(NULL, TEXT("#32512"));    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wndclass.lpszMenuName  = NULL;    wndclass.lpszClassName = szAppName;     if (!RegisterClass(&wndclass))    {       MessageBox(NULL, TEXT("This program requires Windows NT series!"), szAppName, MB_ICONERROR);       return -1;    }     hwnd = CreateWindowEx(WS_EX_APPWINDOW,         // A tool window does not appear in the task bar or in the window that appears when the user presses ALT+TAB.                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW,        // window style                          100,//CW_USEDEFAULT,              // initial x position                          200,//CW_USEDEFAULT,              // initial y position                          620,//CW_USEDEFAULT,              // initial x size                          320,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters     ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);     {       BOOL bRet;       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)       {          if (bRet == -1)          {             MessageBox(NULL, TEXT("GetMessage Error."), TEXT("Message"), MB_ICONERROR);             return -1;          }          else          {             TranslateMessage(&msg);             DispatchMessage(&msg);          }       }    }     UnregisterClass(szAppName, hInstance);    return msg.wParam; }  /* 当static控件或具有ES_READONLY风格的edit控件被绘制时,会向父窗口发送WM_CTLCOLORSTATIC消息。 如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows会使用该画刷来绘制控件背景(子窗口背景)。 也就是说,改变static控件的背景颜色只有这一种方式,就是处理WM_CTLCOLORSTATIC消息。WM_CTLCOLORSTATIC消息就是用来设置背景画刷的。 */  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    HDC hdcStatic;    static HFONT hFont; //逻辑字体    static HWND hStatic; //静态文本框控件    static HBRUSH hBrush; //画刷     switch (message)    {    case WM_CREATE:       //创建画刷       hBrush = CreateSolidBrush(RGB(0x41, 0x96, 0x4F)); //翠绿色       //创建逻辑字体       hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 700 /*700表示粗体*/,                          FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/, DEFAULT_CHARSET,                          OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,                          FF_DONTCARE, TEXT("微软雅黑"));       //创建静态文本框控件       hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到C语言的世界！"),                              WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER,                              20 /*x坐标*/, 20 /*y坐标*/, 240 /*宽度*/, 60 /*高度*/,                              hwnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/, NULL/*当前程序实例句柄*/, NULL);       //设置控件的字体       SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, 0);       break;     case WM_CTLCOLORSTATIC:       hdcStatic = (HDC)wParam;       SetTextColor(hdcStatic, RGB(0x41, 0x96, 0x4F)); //翠绿色       SetBkMode(hdcStatic, TRANSPARENT); //透明背景       return (INT_PTR)GetStockObject(NULL_BRUSH); //无颜色画刷     case WM_DESTROY:       DeleteObject(hBrush);       DeleteObject(hFont);       PostQuitMessage(0);       break;    default:       return DefWindowProc(hwnd, message, wParam, lParam);    }    return 0; }

user: user-0
content: 引用 1 楼 陈仲甫 的回复:https://docs.microsoft.com/en-us/cpp/mfc/reference/cwnd-class?view=vs-2019#onctlcolor  C语言

user: user-5
content: https://docs.microsoft.com/en-us/cpp/mfc/reference/cwnd-class?view=vs-2019#onctlcolor