// win32-0.cpp : 定義應用程式的入口點。
//
#include "stdafx.h"
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK scrollpro (HWND,UINT,WPARAM,LPARAM);
int idfocus;
WNDPROC oldscoll[3];
static int color[3],cychar;
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ; //視窗句柄
MSG msg ; //訊息結構
WNDCLASS wndclass ; //視窗類結構
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//加載圖示供程式使用
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!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
//根據視窗類創建一個視窗
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ; //在螢屏上顯示視窗
UpdateWindow (hwnd) ; //指示視窗重繪自身
while (GetMessage (&msg, NULL, 0, 0)) //從訊息佇列中獲取訊息
{
TranslateMessage (&msg) ; //轉換某些鍵盤訊息
DispatchMessage (&msg) ; //將訊息發送給視窗程序
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
static COLORREF crprim [3] = {RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};
static HBRUSH hbrush[3],hbrushstatic;
static HWND hwndscroll[3],hwndlabel[3],hwndvalue[3],hwndrect;
static RECT rccolor;
static TCHAR * szcolorlabel[] = {TEXT("RED"),TEXT("GREEN"),TEXT("BLUE")};//text->unicode 無法初始化char陣列故為指標
HINSTANCE hinstance; //指向實體的指標
int i,cxclient,cyclient;
TCHAR szbuffer[10]; //寬字符緩沖區 用以暫存顏色值
switch (message)
{
case WM_CREATE:
hinstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hwndrect = CreateWindow(TEXT("static"),NULL,
WS_CHILD|WS_VISIBLE|SS_WHITERECT,
0,0,0,0,hwnd,(HMENU)9,hinstance,NULL);
for(i=0;i<3;i++)
{
hwndscroll[i] = CreateWindow(TEXT("scrollbar"),NULL,
WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,0,0,0,0,
hwnd,(HMENU)i,hinstance,NULL);
SetScrollRange(hwndscroll[i],SB_CTL,0,255,false);
SetScrollPos(hwndscroll[i],SB_CTL,0,false);
hwndlabel[i] = CreateWindow(TEXT("static"),szcolorlabel[i],
WS_VISIBLE|WS_CHILD|SS_CENTER,0,0,0,0,
hwnd,(HMENU)(i+3),hinstance,NULL);
oldscoll[i] = (WNDPROC)SetWindowLong(hwndscroll[i],GWL_WNDPROC,(LONG)scrollpro);
//求出滾動條視窗函式指標!~~~~~~~~~~!!!!!!!!!!!!!!!!
}
hbrushstatic = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
hbrush[i] = CreateSolidBrush(crprim[i]);
cychar = HIWORD(GetDialogBaseUnits());
return 0;
case WM_SIZE:
cxclient = LOWORD(lParam);
cyclient = HIWORD(lParam);
SetRect(&rccolor,cxclient / 2,0,cxclient,cyclient);
MoveWindow(hwndrect,0,0,cxclient / 2,cyclient,true);
for(i=0;i<3;i++)
{
MoveWindow(hwndscroll[i],
(2 * i + 1) * cxclient / 14,2 * cychar,
cxclient / 14,cyclient - 4,true);
MoveWindow(hwndlabel[i],
(4 * i + 1) * cxclient / 28,cychar / 2,
cxclient / 7,cychar,true);
MoveWindow(hwndvalue[i],
(4 * i + 1) * cxclient / 28,
cyclient - 3 * cychar / 2,
cxclient / 7,cychar,true);
}
SetFocus(hwnd);
return 0;
/* case WM_SETFOCUS:
SetFocus(hwndscroll[idfocus]);
return 0;*/
case WM_VSCROLL:
i = GetWindowLong((HWND)lParam,GWL_ID);//子視窗ID
switch (LOWORD(lParam))
{
case SB_PAGEDOWN:
color[i] += 15;
break;
case SB_LINEDOWN:
color[i] += 1;
break;
case SB_PAGEUP:
color[i] -= 15;
break;
case SB_LINEUP:
color[i] -= 1;
break;
case SB_TOP:
color[i] = 0;
break;
case SB_BOTTOM:
color[i] = 255;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
color[i] = HIWORD(wParam);
break;
default:
break;
}
SetScrollPos(hwndscroll[i],SB_CTL,color[i],true);
wsprintf(szbuffer,TEXT("%i"),color[i]);
SetWindowText(hwndvalue[i],szbuffer);
//DeleteObject(HBRUSH);
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2])));
InvalidateRect(hwnd,&rccolor,true);
return 0;
case WM_CTLCOLORSCROLLBAR:
i = GetWindowLong((HWND)lParam,GWL_ID);
return (LRESULT)hbrush[i];
break;
case WM_CTLCOLORSTATIC:
i = GetWindowLong((HWND)lParam,GWL_ID);
if(i>=3 && i<=8)
{
SetTextColor((HDC)wParam,crprim[i % 3]);
SetBkColor((HDC)wParam,GetSysColor(COLOR_BTNHIGHLIGHT));
return (LRESULT)hbrushstatic;
}
break;
case WM_SYSCOLORCHANGE:
DeleteObject(hbrushstatic);
hbrushstatic = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
return 0;
/*case WM_PAINT
hdc = BeginPaint (hwnd, &ps) ; //開始視窗繪制
GetClientRect (hwnd, &rect) ; //獲取視窗客戶區的尺寸
DrawText (hdc, TEXT ("Hello, Windows i am 王晨光"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //顯示文本串
EndPaint (hwnd, &ps) ; //結束視窗繪制
return 0 ;*/
case WM_DESTROY:
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH));
for(i=0;i<3;i++)
DeleteObject(hbrush[i]);
DeleteObject(hbrushstatic);
PostQuitMessage (0) ; //在訊息佇列中插入一條“退出”訊息
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam);//執行默認的訊息處理
}
LRESULT CALLBACK scrollpro (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int id = GetWindowLong(hwnd,GWL_ID);
switch (message)
{
case WM_KEYDOWN:
break;
case WM_SETFOCUS:
idfocus = id;
break;
/*case WM_DESTROY:
PostQuitMessage (0);
return 0;*/
}
return CallWindowProc (oldscoll[id],hwnd, message, wParam, lParam);//執行默認的訊息處理
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/78712.html
上一篇:關于WM_SIZE中使用MoveWindow無效果的問題
下一篇:………………
