当前位置:C++技术网 > 资讯 > 用main玩Win32窗口程序,屌丝玩法,来玩玩吧

用main玩Win32窗口程序,屌丝玩法,来玩玩吧

更新时间:2016-02-04 23:37:19浏览次数:1+次

main可以干WinMain干的所有事,下面就用所谓的控制台方法创建窗口程序,不信你看
// Console.cpp : 定义控制台应用程序的入口点。
//
#include <windows.h>
#include <stdio.h>

HWND g_hConBtn;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND hWndBtn_1, hWndBtn_2, hWndBtn_3, hWndBtn_4, hWndBtn_5;
	static HWND hMainWnd,hConWnd;
	RECT rect;
	static BOOL bFlag = FALSE;
	switch (message)
	{
	case WM_CREATE:
		hMainWnd = hwnd;
		hWndBtn_1 = CreateWindow("button", "把它拽过来", WS_CHILD | WS_VISIBLE, 150, 200, 80, 40, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		hWndBtn_2 = CreateWindow("button", "↑", WS_CHILD | WS_VISIBLE, 150, 40, 40, 30, hwnd, (HMENU)2, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		hWndBtn_3 = CreateWindow("button", ">>", WS_CHILD | WS_VISIBLE, 200, 80, 40, 30, hwnd, (HMENU)3, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		hWndBtn_4 = CreateWindow("button", "↓", WS_CHILD | WS_VISIBLE, 150, 120, 40, 30, hwnd, (HMENU)4, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		hWndBtn_5 = CreateWindow("button", "<<", WS_CHILD | WS_VISIBLE, 100, 80, 40, 30, hwnd, (HMENU)5, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		return 0;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case 1:
			if(!bFlag)
			{
				MessageBox(NULL, "见证奇迹", "", 0);
				hConWnd = SetParent(g_hConBtn, hMainWnd);
				SetWindowText(g_hConBtn, "见或不见");
				bFlag = TRUE;
			}
			else
			{
				MessageBox(NULL, "奇迹已经见证过了", "", 0);
			}
			break;
		case 2:
			if(!hConWnd)
			{
				MessageBox(NULL, "你要先拽一下", "", 0);
			}
			else
			{
				GetWindowRect(hConWnd, &rect);
				MoveWindow(hConWnd, rect.left, rect.top - 20, rect.right - rect.left, rect.bottom - rect.top, TRUE);
			}
			break;
		case 3:
			if (!hConWnd)
			{
				MessageBox(NULL, "你要先拽一下", "", 0);
			}
			else
			{
				GetWindowRect(hConWnd, &rect);
				MoveWindow(hConWnd, rect.left + 20, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
			}
			break;
		case 4:
			if (!hConWnd)
			{
				MessageBox(NULL, "你要先拽一下", "", 0);
			}
			else
			{
				GetWindowRect(hConWnd, &rect);
				MoveWindow(hConWnd, rect.left, rect.top + 20, rect.right - rect.left, rect.bottom - rect.top, TRUE);
			}
			break;
		case 5:
			if (!hConWnd)
			{
				MessageBox(NULL, "你要先拽一下", "", 0);
			}
			else
			{
				GetWindowRect(hConWnd, &rect);
				MoveWindow(hConWnd, rect.left - 20, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
			}
			break;
		case 6:
			if (ShowWindow(hConWnd, SW_HIDE))
			{
			}
			else
			{
				ShowWindow(hConWnd, SW_NORMAL);
			}
			break;
		default:
			break;
		}
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

int main()
{
	HWND hConWnd = GetConsoleWindow();
	HDC hConDC = GetDC(hConWnd);
	HPEN hConPen = CreatePen(PS_SOLID, 5, RGB(255, 100, 100));
	HBRUSH hConBrush = CreateSolidBrush(RGB(50, 200, 100));
	HPEN hOldPen = (HPEN)SelectObject(hConDC, hConPen);
	HBRUSH hOldBrush = (HBRUSH)SelectObject(hConDC, hConBrush);
	Rectangle(hConDC, 210, 200, 450, 380);
	TextOut(hConDC, 250, 250, "C++技术网",9);
	TextOut(hConDC, 250, 300, "试试键盘的上下左右键", 20);
	TextOut(hConDC, 250, 350, "欢迎大家前来学习交流", 20);
	HINSTANCE hConInstance = (HINSTANCE)GetWindowLong(hConWnd, GWL_HINSTANCE);
	HWND hConBtn = CreateWindow("button", "控制台按钮", WS_CHILD | WS_VISIBLE, 280, 20, 80, 40, hConWnd, (HMENU)6, hConInstance, NULL);
	g_hConBtn = hConBtn;
	HWND hConEdit = CreateWindow("edit", "在控制台窗口中键盘\r\n上下左右键可以控制右边窗口", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_LEFT | WS_HSCROLL | WS_VSCROLL, 10, 20, 240, 160, hConWnd, 0, hConInstance, NULL);

	MoveToEx(hConDC, 400, 10, NULL);
	LineTo(hConDC, 600, 200);
	
	INPUT_RECORD irBuf[128] = { 0 };
	HANDLE hStdHandle = GetStdHandle(STD_INPUT_HANDLE);
	DWORD dwMode = 0, dwNumOfEventRead=0;
	GetConsoleMode(hStdHandle, &dwMode);
	dwMode |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
	SetConsoleMode(hStdHandle, dwMode);

	static TCHAR szAppName[] = TEXT("ConsoleClass");
	HWND         hwnd;
	MSG          msg;
	WNDCLASS     wndclass;

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hConInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(hConInstance, MAKEINTRESOURCE(IDC_ARROW));//LoadCursor (NULL, IDC_ARROW) ;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	RegisterClass(&wndclass);

	hwnd = CreateWindow(szAppName,                  // window class name
		TEXT("Hello C++技术网"), // window caption
		WS_OVERLAPPEDWINDOW,        // window style
		800,              // initial x position
		50,              // initial y position
		400,              // initial x size
		400,              // initial y size
		NULL,                       // parent window handle
		NULL,                       // window menu handle
		hConInstance,                  // program instance handle
		NULL);                     // creation parameters

	RECT rect;
	char ch = 0, buf[128] = { 0 };
	GetWindowRect(hConWnd, &rect);
	MoveWindow(hwnd, rect.right, rect.top, 400, 400, TRUE);
	ShowWindow(hwnd, SW_NORMAL);
	UpdateWindow(hwnd);
	while (1)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			PeekConsoleInput(hStdHandle, irBuf, 128, &dwNumOfEventRead);
			FlushConsoleInputBuffer(hStdHandle);
			for (int i = 0; i < dwNumOfEventRead; i++)
			{
				switch (irBuf[i].EventType)
				{
				case MOUSE_EVENT:
					memset(buf, 0, 128 * sizeof(char));
					sprintf_s(buf, "拿走鼠标有惊喜\r\n鼠标位置 Line_X:%d  Line_Y:%d", irBuf[i].Event.MouseEvent.dwMousePosition.X, irBuf[i].Event.MouseEvent.dwMousePosition.Y);
					SendMessage(hConEdit, WM_SETTEXT, 0, (LPARAM)buf);
					
					break;
				case KEY_EVENT:
					GetWindowRect(hwnd, &rect);
					memset(buf, 0, 128 * sizeof(char));
					sprintf_s(buf, "左:%u 上:%u \r\n右:%u 下:%u", rect.left, rect.top,  rect.right, rect.bottom);
					SendMessage(hConEdit, WM_SETTEXT, 0, (LPARAM)buf);
					
					ch = irBuf[i].Event.KeyEvent.wVirtualKeyCode;
					switch (ch)
					{
					case VK_LEFT:
						MoveWindow(hwnd, rect.left - 20, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
						break;
					case VK_RIGHT:
						MoveWindow(hwnd, rect.left + 20, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
						break;
					case VK_UP:
						MoveWindow(hwnd, rect.left, rect.top - 20, rect.right - rect.left, rect.bottom - rect.top, TRUE);
						break;
					case VK_DOWN:
						MoveWindow(hwnd, rect.left, rect.top + 20, rect.right - rect.left, rect.bottom - rect.top, TRUE);
						break;
					default:
						break;
					}
					break;
				default:
					break;
				}
			}
		}    
	}
	SelectObject(hConDC, hOldPen);
	SelectObject(hConDC, hOldBrush);
	DeleteObject(hConPen);
	DeleteObject(hConBrush);
	ReleaseDC(hConWnd, hConDC);
	return msg.wParam;
}
看,先给出源代码,具体下次讲解