dwExStyle 和dwStyle

扩展窗口风格:
WS_EX_ACCEPTFILES 指明用这个风格创建的窗口能够接受拖放文件。 
· WS_EX_CLIENTEDGE 指明窗口具有3D外观,这意味着,边框具有下沉的边界。 
· WS_EX_CONTEXTHELP 在窗口的标题条中包含问号。当用户单击问号时,鼠标光标的形状变为带指针的问号。如果用户随后单击一个子窗口,子窗口将接收到一个WM_HELP消息。 
· WS_EX_CONTROLPARENT 允许用户用TAB键遍历窗口的子窗口。 
· WS_EX_DLGMODALFRAME 指明一个具有双重边界的窗口,当你在dwStyle参数中指定了WS_CAPTION风格标志时,它可以具有标题条(可选)。 
· WS_EX_LEFT 指定窗口具有左对齐属性。这是缺省值。 
· WS_EX_LEFTSCROLLBAR 将垂直滚动条放在客户区的左边。 
· WS_EX_LTRREADING 按照从左到右的方式显示窗口文本。这是缺省方式。 
· WS_EX_MDICHILD 创建一个MDI子窗口。 
· WS_EX_NOPARENTNOTIFY 指定用这个风格创建的子窗口在被创建或销毁的时候将不向父窗口发送WM_PARENTNOTIFY消息。 
· WS_EX_OVERLAPPEDWINDOW 组合了WS_EX_CLIENTEDGE和WS_EX_WIND-OWEDGE风格。 
· WS_EX_PALETTEWINDOW 组合了WS_EX_WINDOWEDGE和WS_EX_TOPMOST风格。 
· WS_EX_RIGHT 赋予窗口右对齐属性。这与窗口类有关。 
· WS_EX_RIGHTSCROLLBAR 将垂直滚动条(如果有)放在客户区的右边。这是缺省方式。 
· WS_EX_RTLREADING 按照从右到左的顺序显示窗口文本。 
· WS_EX_STATICEDGE 创建一个具有三维边界的窗口,用于不接受用户输入的项。 
· WS_EX_TOOLWINDOW 创建一个工具窗口,目的是被用作浮动工具条。工具窗口具有标题条,比通常的标题条要短,窗口的标题是用小字体显示的。工具窗口不出现在任务条或用户按下ALT+TAB时出现的窗口中。 
· WS_EX_TOPMOST 指定用这个风格创建的窗口必须被放在所有非顶层窗口的上面,即使这个窗口已经不处于激活状态,它还是保留在最上面。应用程序可以用SetWindowsPos成员函数来加入或去掉这个属性。 
· WS_EX_TRANSPARENT 指定了用这个风格创建的窗口是透明的。这意味着,在这个窗口下面的任何窗口都不会被这个窗口挡住。用这个风格创建的窗口只有当它下面的窗口都更新过以后才接收WM_PAINT消息。 
· WS_EX_WINDOWEDGE 指定了具有凸起边框的窗口。
窗口风格:
· WS_BORDER 创建一个有边界的窗口。 
· WS_CAPTION 创建一个有标题条的窗口(隐含WS_BORDER风格)。不能与WS_DLGFRAME风格一起使用。 
· WS_CHILD 创建一个子窗口。不能与WS_POPUP风格一起使用。 
· WS_CLIPCHILDREN 当你在父窗口中绘图时,除去子窗口所占的区域。在创建父窗口的时候使用。 
· WS_CLIPSIBLINGS 剪裁相关的子窗口,这意味着,当一个特定的子窗口接收到重绘消息时,WS_CLIPSIBLINGS风格将在子窗口要重画的区域中去掉与其它子窗口重叠的部分。(如果没有指定WS_CLIPSIBLINGS风格,并且子窗口有重叠,当你在一个子窗口的客户区绘图时,它可能会画在相邻的子窗口的客户区中。)只与WS_CHILD风格一起使用。 
· WS_DISABLED 创建一个初始状态为禁止的窗口。 
· WS_DLGFRAME 创建一个窗口,具有双重边界,但是没有标题条。 
· WS_GROUP 指定一组控件中的第一个,用户可以用箭头键在这组控件中移动。在第一个控件后面把WS_GROUP风格设置为FALSE的控件都属于这一组。下一个具有WS_GROUP风格的控件将开始下一组(这意味着一个组在下一组的开始处结束)。 
· WS_HSCROLL 创建一个具有水平滚动条的窗口。 
· WS_MAXIMIZE 创建一个最大化的窗口。 
· WS_MAXIMIZEBOX 创建一个具有最大化按钮的窗口。 
· WS_MINIMIZE 创建一个初始状态为最小化的窗口。仅与WS_OVERLAPPED风格一起使用。 
· WS_MINIMIZEBOX 创建一个具有最小化按钮的窗口。 
· WS_OVERLAPPED 创建一个重叠窗口。重叠窗口通常具有标题条和边界。 
· WS_OVERLAPPEDWINDOW 创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX风格的重叠式窗口。 
· WS_POPUP 创建一个弹出式窗口,不能与WS_CHILD风格一起使用。 
· WS_POPUPWINDOW 创建一个具有WS_BORDER,WS_POPUP和WS_SYSMENU风格的弹出窗口。为了使控制菜单可见,必须与WS_POPUPWINDOW一起使用WS_CAPTION风格。 
· WS_SYSMENU 创建一个在标题条上具有控制菜单的窗口。仅对带标题条的窗口使用。 
· WS_TABSTOP 指定了一些控件中的一个,用户可以通过TAB键来移过它。TAB键使用户移动到下一个用WS_TABSTOP风格定义的控件。 
· WS_THICKFRAME 创建一个具有厚边框的窗口,可以通过厚边框来改变窗口大小。 
· WS_VISIBLE 创建一个最初可见的窗口。 
· WS_VSCROLL 创建一个具有垂直滚动条的窗口。
首先,我们需要定义一个API结构来实现绘制抛物线、双曲线、放大缩小和移动功能。 ```c++ #include <Windows.h> // 定义抛物线结构体 struct Parabola { int a; // 抛物线系数 int b; // 抛物线系数 int c; // 抛物线系数 }; // 定义双曲线结构体 struct Hyperbola { int a; // 双曲线系数 int b; // 双曲线系数 int c; // 双曲线系数 }; // 定义窗口类 class Window { public: Window(); ~Window(); bool Create(LPCTSTR lpWindowName, DWORD dwStyle, DWORD dwExStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent = NULL, HMENU hMenu = NULL); void Show(int nCmdShow); private: static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); HWND m_hWnd; Parabola m_parabola; Hyperbola m_hyperbola; int m_zoom; int m_xOffset; int m_yOffset; void DrawParabola(HDC hdc); void DrawHyperbola(HDC hdc); void ZoomIn(); void ZoomOut(); void MoveLeft(); void MoveRight(); void MoveUp(); void MoveDown(); }; ``` 然后,我们需要在窗口类中实现绘制抛物线、双曲线、放大缩小和移动功能。 ```c++ #include <math.h> // 窗口类构造函数 Window::Window() : m_hWnd(NULL), m_zoom(1), m_xOffset(0), m_yOffset(0) { m_parabola.a = 1; m_parabola.b = 0; m_parabola.c = 0; m_hyperbola.a = 1; m_hyperbola.b = 0; m_hyperbola.c = 0; } // 窗口类析构函数 Window::~Window() { } // 创建窗口 bool Window::Create(LPCTSTR lpWindowName, DWORD dwStyle, DWORD dwExStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetModuleHandle(NULL); wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = TEXT("WindowClass"); wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wcex)) { return false; } m_hWnd = CreateWindowEx(dwExStyle, TEXT("WindowClass"), lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, GetModuleHandle(NULL), this); if (!m_hWnd) { return false; } return true; } // 显示窗口 void Window::Show(int nCmdShow) { ShowWindow(m_hWnd, nCmdShow); UpdateWindow(m_hWnd); } // 窗口消息处理函数 LRESULT CALLBACK Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Window* pWindow; if (message == WM_NCCREATE) { pWindow = static_cast<Window*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams); SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pWindow)); pWindow->m_hWnd = hWnd; } else { pWindow = reinterpret_cast<Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); } if (pWindow) { switch (message) { case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); // 绘制抛物线和双曲线 pWindow->DrawParabola(hdc); pWindow->DrawHyperbola(hdc); EndPaint(hWnd, &ps); break; case WM_KEYDOWN: switch (wParam) { case VK_ADD: // 放大 pWindow->ZoomIn(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_SUBTRACT: // 缩小 pWindow->ZoomOut(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_LEFT: // 左移 pWindow->MoveLeft(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_RIGHT: // 右移 pWindow->MoveRight(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_UP: // 上移 pWindow->MoveUp(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_DOWN: // 下移 pWindow->MoveDown(); InvalidateRect(hWnd, NULL, TRUE); break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } else { return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // 绘制抛物线 void Window::DrawParabola(HDC hdc) { int x, y; HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); HPEN hOldPen = (HPEN)SelectObject(hdc, hPen); for (x = -100; x <= 100; x++) { y = m_parabola.a * x * x + m_parabola.b * x + m_parabola.c; y = -y; x = m_zoom * x + m_xOffset; y = m_zoom * y + m_yOffset; if (x >= 0 && x <= 800 && y >= 0 && y <= 600) { SetPixel(hdc, x, y, RGB(0, 0, 255)); } } SelectObject(hdc, hOldPen); DeleteObject(hPen); } // 绘制双曲线 void Window::DrawHyperbola(HDC hdc) { int x, y; HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); HPEN hOldPen = (HPEN)SelectObject(hdc, hPen); for (x = -100; x <= 100; x++) { y = m_hyperbola.a * x * x + m_hyperbola.b * x + m_hyperbola.c; y = -y; x = m_zoom * x + m_xOffset; y = m_zoom * y + m_yOffset; if (x >= 0 && x <= 800 && y >= 0 && y <= 600) { SetPixel(hdc, x, y, RGB(255, 0, 0)); } } SelectObject(hdc, hOldPen); DeleteObject(hPen); } // 放大 void Window::ZoomIn() { m_zoom++; } // 缩小 void Window::ZoomOut() { if (m_zoom > 1) { m_zoom--; } } // 左移 void Window::MoveLeft() { m_xOffset -= 10; } // 右移 void Window::MoveRight() { m_xOffset += 10; } // 上移 void Window::MoveUp() { m_yOffset -= 10; } // 下移 void Window::MoveDown() { m_yOffset += 10; } ``` 最后,我们需要在窗口的消息循环中处理消息。 ```c++ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { Window window; if (!window.Create(TEXT("API Demo"), WS_OVERLAPPEDWINDOW, 0, CW_USEDEFAULT, 0, 800, 600)) { return 0; } window.Show(nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` 现在,我们就成功地实现了一个基于API结构的windows应用程序,并使用GDI绘制抛物线和双曲线,并实现了放大缩小和移动功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值