#include <Windows.h>
#include <stdio.h>
#include "resource.h"
//#include <afxwin.h>
LRESULT CALLBACK MyWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
static TCHAR MyAppName[]=TEXT("My first windows app");
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=MyWindowProc;
wndclass.cbClsExtra=0;//预留的额外空间
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=::LoadIcon(NULL,IDI_INFORMATION);
wndclass.hCursor=::LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=TEXT("My first windows app");
if (!RegisterClass(&wndclass))
{
int i=GetLastError();
//char str[25]={0};
wchar_t chResult[128]={0};
_itow(i,chResult,10);
//sprintf(str,TEXT("%d"),i);
//sprintf(buffer,L"Key State = 0X%X ",key_state);
MessageBox(NULL,chResult,TEXT("Error"),MB_OK);
//AfxMessageBox(TEXT("Error") );
}
hwnd=CreateWindow( MyAppName,
TEXT("My first windows"),
WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
CW_USEDEFAULT ,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,
hInstance,
NULL
);
ShowWindow(hwnd,SW_SHOWNORMAL);
//ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK MyWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
PAINTSTRUCT lp;
RECT rect;
HDC hdc;
TEXTMETRIC tm;
static int cxChar,cyChar,cxCaps;
static int cxClient,cyClient,iVscrollPos;
switch(uMsg)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
cxChar=tm.tmAveCharWidth;
cyChar=tm.tmHeight+tm.tmExternalLeading;
cxCaps=(tm.tmPitchAndFamily&1?3:2)*cxChar/2;//平均宽度
ReleaseDC(hwnd,hdc);
SetScrollRange(hwnd,SB_VERT,0,999,FALSE);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
return 0;
case WM_PAINT:
/*HDC*/ hdc=BeginPaint(hwnd,&lp);//
/*
在case里面不能直接声明变量
你有两种选择
1. 将变量j的声明提取到switch的外面
2. 将case的语句块用大括号(“{” “}”)括起来
*/
//GetClientRect(hwnd,&rect);
//DrawText(dc,TEXT("Hello World"),-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//TextOut(dc,(rect.right-rect.left)/2,(rect.bottom-rect.top)/2,TEXT("hello world"),wcslen(TEXT("hello world")));
for(int i=0;i<1000;i++)
{
TextOut(hdc,0,cyChar*i,TEXT("Hello World"),wcslen(TEXT("Hello World")));
TextOut(hdc,22*cxCaps,cyChar*i,TEXT("Hello World"),wcslen(TEXT("Hello World")));
SetTextAlign(hdc,TA_RIGHT|TA_TOP);
TextOut(hdc,22*cxCaps+40*cxChar,cyChar*i,TEXT("Hello World"),wcslen(TEXT("Hello World")));
SetTextAlign(hdc,TA_LEFT|TA_TOP);
}
EndPaint(hwnd,&lp);
return 0;
case WM_SIZE:
cyClient=HIWORD(lParam);
return 0;
case WM_VSCROLL:// wParam LOW 鼠标在滚动条上的动作
switch(LOWORD(wParam))
{
case SB_LINEDOWN:
iVscrollPos+=1;
break;
case SB_LINEUP:
iVscrollPos-=1;
break;
case SB_PAGEDOWN:
iVscrollPos+=cyClient/cyChar;
break;
case SB_PAGEUP:
iVscrollPos-=cyClient/cyChar;
break;
case SB_THUMBPOSITION:
iVscrollPos=HIWORD(wParam);
default:
break;
}
iVscrollPos=max(0,min(iVscrollPos,999));
if (iVscrollPos!=GetScrollPos(hwnd,SB_VERT))
{
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg, wParam,lParam );
}