(API)(SDK) 搞了一天还没搞定,静态文本和背景变色,,求大神,(完整代码)

木黑神 2015-07-17 11:59:36
SetTextColor和SetBkColor
在别的程序里都能变色,在这代码里就不行。。
case WM_CTLCOLORATSTIC 里用了也不行,不知什么原因造成的???

# include <windows.h>
//# include "resource.h"
# include <stdio.h>

#define sb1 1
#define sb2 2
#define sb3 3

#define st1 1
#define st2 2
#define st3 3
#define st4 4
#define st5 5
#define st6 6
#define st7 7

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
static TCHAR zz[10] = TEXT("zz");

WNDCLASS a;
HWND hwnd;
MSG msg;

a.cbClsExtra = 0;
a.cbWndExtra = 0;
a.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//(COLOR_BTNFACE + 1);
a.hCursor = LoadCursor(NULL,IDC_ARROW);
a.hIcon = LoadIcon(NULL,IDI_APPLICATION);//LoadIcon(hInstance,TEXT("myicon"));
a.hInstance = hInstance;
a.lpfnWndProc = WindowProc;
a.lpszClassName = zz;
a.lpszMenuName = NULL;
a.style = CS_HREDRAW |CS_VREDRAW;

if(!RegisterClass(&a))
return 0;

hwnd = CreateWindow(zz,TEXT("Application"),WS_OVERLAPPEDWINDOW,400,200,GetSystemMetrics(SM_CXSCREEN)/2,GetSystemMetrics(SM_CYSCREEN)/2,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static HWND hsb, hsb1, hsb2, hsb3, hst, hst1, hst2, hst3, hst4, hst5, hst6, hst7;
static int cxClient, cyClient;
PAINTSTRUCT ps;
static int red = 0, green = 0, blue = 0;
static int vpos = 0;
static TCHAR ch[5];
static RECT rect;
static HBRUSH oldbrush;

switch(uMsg)
{
case WM_CREATE:
hst1 = CreateWindow("static",NULL,WS_CHILD|WS_VISIBLE|SS_WHITERECT,0,0,0,0,hwnd,(HMENU)st1,((LPCREATESTRUCT)lParam)->hInstance,NULL);

hst2 = CreateWindow("static",TEXT("红"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st2,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hst3 = CreateWindow("static",TEXT("绿"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st3,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hst4 = CreateWindow("static",TEXT("蓝"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st4,((LPCREATESTRUCT)lParam)->hInstance,NULL);

hst5 = CreateWindow("static",TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st5,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hst6 = CreateWindow("static",TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st6,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hst7 = CreateWindow("static",TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)st7,((LPCREATESTRUCT)lParam)->hInstance,NULL);

hsb1 = CreateWindow("scrollbar",NULL,WS_CHILD|WS_VISIBLE|SBS_VERT,0,0,0,0,hwnd,(HMENU)sb1,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hsb2 = CreateWindow("scrollbar",NULL,WS_CHILD|WS_VISIBLE|SBS_VERT,0,0,0,0,hwnd,(HMENU)sb2,((LPCREATESTRUCT)lParam)->hInstance,NULL);
hsb3 = CreateWindow("scrollbar",NULL,WS_CHILD|WS_VISIBLE|SBS_VERT,0,0,0,0,hwnd,(HMENU)sb3,((LPCREATESTRUCT)lParam)->hInstance,NULL);

SetScrollRange(hsb1, SB_CTL, 0, 255,FALSE);
SetScrollPos(hsb1, SB_CTL, 0,FALSE);

SetScrollRange(hsb2, SB_CTL, 0, 255,FALSE);
SetScrollPos(hsb2, SB_CTL, 0,FALSE);

SetScrollRange(hsb3, SB_CTL, 0, 255,FALSE);
SetScrollPos(hsb3, SB_CTL, 0,FALSE);
break;
case WM_CTLCOLORSTATIC:
SetTextColor((HDC)wParam,RGB(255,0,0));
SetBkColor((HDC)wParam,RGB(255,0,0));
return (LRESULT)oldbrush;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);

MoveWindow(hsb1, cxClient/12, cyClient/10, cxClient/30, cyClient - cyClient/5,TRUE);
MoveWindow(hsb2, cxClient/5, cyClient/10, cxClient/30, cyClient - cyClient/5,TRUE);
MoveWindow(hsb3, cxClient/3, cyClient/10, cxClient/30, cyClient - cyClient/5,TRUE);

MoveWindow(hst1, 0, 0, cxClient/2, cyClient,TRUE);

MoveWindow(hst2, cxClient/12, cyClient/20, cxClient/30, cyClient/20,TRUE);
MoveWindow(hst3, cxClient/5, cyClient/20, cxClient/30, cyClient/20,TRUE);
MoveWindow(hst4, cxClient/3, cyClient/20, cxClient/30, cyClient/20,TRUE);

MoveWindow(hst5, cxClient/12, cyClient - cyClient/10, cxClient/30, cyClient/20,TRUE);
MoveWindow(hst6, cxClient/5, cyClient - cyClient/10, cxClient/30, cyClient/20,TRUE);
MoveWindow(hst7, cxClient/3, cyClient - cyClient/10, cxClient/30, cyClient/20,TRUE);

rect.top = 0;
rect.left = cxClient/2;
rect.right = cxClient+1;
rect.bottom = cyClient+1;
break;
case WM_VSCROLL:
if((HWND)lParam == hsb1)
{
hsb = hsb1;
hst = hst5;
vpos = GetScrollPos(hsb1,SB_CTL);
}
else if((HWND)lParam == hsb2)
{
hsb = hsb2;
hst = hst6;
vpos = GetScrollPos(hsb2,SB_CTL);
}
else
{
hsb = hsb3;
hst = hst7;
vpos = GetScrollPos(hsb3,SB_CTL);
}

switch(LOWORD(wParam))
{
case SB_LINEUP:
vpos -= 1;
if(vpos < 0)
vpos = 0;
break;
case SB_LINEDOWN:
vpos += 1;
if(vpos > 255)
vpos = 255;
break;
case SB_PAGEUP:
vpos -= 20;
if(vpos < 0)
vpos = 0;
break;
case SB_PAGEDOWN:
vpos += 20;
if(vpos > 255)
vpos = 255;
break;
case SB_THUMBTRACK:
vpos = HIWORD(wParam);
break;
}

if(vpos != GetScrollPos(hsb,SB_CTL))
{
SetScrollPos(hsb,SB_CTL,vpos,TRUE);
sprintf(ch,"%d", vpos);
SetWindowText(hst,ch);
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
FillRect(hdc,&rect,CreateSolidBrush(RGB(GetScrollPos(hsb1,SB_CTL),GetScrollPos(hsb2,SB_CTL),GetScrollPos(hsb3,SB_CTL))));
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
...全文
205 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2015-07-18
  • 打赏
  • 举报
回复
Edi控件的窗口style:
/*
 * Edit Control Styles
 */
#define ES_LEFT             0x0000L
#define ES_CENTER           0x0001L
#define ES_RIGHT            0x0002L
#define ES_MULTILINE        0x0004L
#define ES_UPPERCASE        0x0008L
#define ES_LOWERCASE        0x0010L
#define ES_PASSWORD         0x0020L
#define ES_AUTOVSCROLL      0x0040L
#define ES_AUTOHSCROLL      0x0080L
#define ES_NOHIDESEL        0x0100L
#define ES_OEMCONVERT       0x0400L
#define ES_READONLY         0x0800L
#define ES_WANTRETURN       0x1000L
#if(WINVER >= 0x0400)
#define ES_NUMBER           0x2000L
#endif /* WINVER >= 0x0400 */
比如你要判断Edit是否为只读,只需要判断style位码是否包含ES_READONLY:
GetWindowLong(hwnd, GWL_STYLE) & ES_READONLY != 0表示为只读!
阿源是少年 2015-07-18
  • 打赏
  • 举报
回复
引用 4 楼 shuo101 的回复:
[quote=引用 2 楼 worldy的回复:]static控件应该在WM_CTLCOLORSTATIC消息里面设置,edit控件如果设置为只读,应该也是在WM_CTLCOLORSTATIC 消息里设置
怎么看只读和非只读。[/quote] 只要你return (LRESULT)oldbrush;// 没初始化 返回一个非空画刷就有效果了,随便返回一个都行,如:
return (LRESULT)GetStockObject(BLACK_BRUSH);
木黑神 2015-07-18
  • 打赏
  • 举报
回复
引用 2 楼 worldy的回复:
static控件应该在WM_CTLCOLORSTATIC消息里面设置,edit控件如果设置为只读,应该也是在WM_CTLCOLORSTATIC 消息里设置
怎么看只读和非只读。
木黑神 2015-07-18
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster的回复:
case WM_CTLCOLORSTATIC: SetTextColor((HDC)wParam,RGB(255,0,0));// 不分 哪个?nID = ::GetDlgCtrlID(hwnd); SetBkColor((HDC)wParam,RGB(255,0,0));// 都是红的 ? return (LRESULT)oldbrush;// 没初始化
不管什么颜色,但是在程序运行后,static控件的背景色还是系统默认的,btnface.
worldy 2015-07-18
  • 打赏
  • 举报
回复
static控件应该在WM_CTLCOLORSTATIC消息里面设置,edit控件如果设置为只读,应该也是在WM_CTLCOLORSTATIC 消息里设置
schlafenhamster 2015-07-18
  • 打赏
  • 举报
回复
case WM_CTLCOLORSTATIC: SetTextColor((HDC)wParam,RGB(255,0,0));// 不分 哪个?nID = ::GetDlgCtrlID(hwnd); SetBkColor((HDC)wParam,RGB(255,0,0));// 都是红的 ? return (LRESULT)oldbrush;// 没初始化
木黑神 2015-07-18
  • 打赏
  • 举报
回复
[quote=引用 8 楼 shuo101 的回复:] 你去比较lParam就知道是哪个Static控件了,加一个switch(lParam){...} quote] case hst2: CreateWindow返回的句柄,在 switch case 里显示不是表达式不是常量。 我用if 了, 非常感谢你。
阿源是少年 2015-07-18
  • 打赏
  • 举报
回复
LRESULT CALLBACK WindowProc(
  HWND hwnd,       // handle to window
  UINT uMsg,       // WM_CTLCOLORSTATIC
  WPARAM wParam,   // handle to DC (HDC)
  LPARAM lParam    // handle to static control (HWND)
);
wParam是Static的DC,lParam就是句柄了,你每个Static控件都是CreateWindow创建的,你把CreateWindow返回的Static控件句柄保存下来,WM_CTLCOLORSTATIC里面,你去比较lParam就知道是哪个Static控件了,加一个switch(lParam){...}
木黑神 2015-07-18
  • 打赏
  • 举报
回复
[quote=引用 4 楼 shuo101 的回复:] 只要你return (LRESULT)oldbrush;// 没初始化 返回一个非空画刷就有效果了,随便返回一个都行,如: return (LRESULT)GetStockObject(BLACK_BRUSH); static 的背景和文本颜色都变了。 我有6个static ,想把它们设置成6种颜色,可现在全是一种颜色。 case WM_CTLCOLORSTATIC: SetTextColor(hdc,RGB(255,0,0)); SetBkColor((HDC)wParam,RGB(255,255,255)); hdc = GetDC(hst3); SetTextColor(hdc,RGB(0,255,0)); ReleaseDC(hst3,hdc); return (LRESULT)GetStockObject(WHITE_BRUSH); 我使用GetDC 获取,上面static 的句柄,然后选入,可为什么没效果。 不知道有什么方法吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧