能用标准的C语言做MFC的窗口程序吗吗?

能用标准的C语言做MFC的窗口程序吗吗?,第1张

可以。

MFC 是 封装后的 WinAPI 程序,用 的是 C++.

窗口程序 可以直接用 WinAPI 来写,WinAPI 可以写成 C 风格,也可以写成 C++ 风格。

快速入门自学材料见:

http://www.winprog.org/tutorial/

窗口界面的 “控件”直接写资源文件也可以。但无论如何没有 MFC ( 用Visual Studio) 建立方便。

即使是 C 风格 WinAPI 程序,命名时 还是要用 .cpp, 便于编译器处理。

可以使用CreateWindow函数。

CreateWindow,Windows API宏, 在WinUser.h中根据是否已定义Unicode被分别定义为CreateWindowW和CreateWindowA,后两者又被分别定义为对CreateWindowExW和CreateWindowExA函数的调用。

函数原型:

HWND CreateWindow(

LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD dwStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HANDLE hlnstance,

LPVOID lpParam);

参数:

详情

lpClassName

指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。

如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。请看说明部分的列表。

LPWindowName

指向一个指定窗口名的空结束的字符串指针。

如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。

dwStyle

指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义:

WS_BORDER:创建一个带边框的窗口。

WS_CAPTION:创建一个有标题框的窗口(包括WS_BORDER风格)。

WS_CHILD:创建一个子窗口。这个风格不能与WS_POPUP风格合用。

WS_CHILDWINDOW:与WS_CHILD相同。

WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。

WS_CLIPSIBLINGS:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。

WS_DISABLED:创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。

WS_DLGFRAME:创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。

WS_GROUP:指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。

WS_HSCROLL:创建一个有水平滚动条的窗口。

WS_ICONIC:创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。

WS_MAXIMIZE:创建一个初始状态为最大化状态的窗口。

WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。

WS_OVERLAPPED:产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。

WS_OVERLAPPEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。

WS_POPUP:创建一个d出式窗口。该风格不能与WS_CHILD风格同时使用。

WS_POPUPWINDOW:创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。

WS_SIZEBOX:创建一个可调边框的窗口,与WS_THICKFRAME风格相同。

WS_SYSMENU:创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。

WS_TABSTOP:创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。

WS_THICKFRAME:创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。

WS_TILED:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。

WS_TILEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。

WS_VISIBLE:创建一个初始状态为可见的窗口。

WS_VSCROLL:创建一个有垂直滚动条的窗口。

X

指定窗口的初始水平位置。对一个层叠或d出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为d出式窗口或子窗口设定,则X和y参数被设为零。

Y

指定窗口的初始垂直位置。对一个层叠或d出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。

nWidth

以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始Y坐标开始到目标区域的顶部。CW_USEDEFAULT只对层叠窗口有效;如果为d出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。

nHeight

以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。

hWndParent

指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对d出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。

hMenu

菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或d出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。

hlnstance

与窗口相关联的模块实例的句柄。

lpParam

指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。

返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。

例程:

// Window.cpp : Defines the entry point for the application.

#include <windows.h>

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM)

 

 

int APIENTRY WinMain(HINSTANCE hInstance,    //应用程序的实例句柄,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,    //命令行

                     int       nCmdShow)    //显示方式

{

    MSG msg

    HWND hWnd

    char szTitle[]="系统信息"                                // The title bar text

    char szWindowClass[]="popMsg"                                // The title bar text

    WNDCLASSEX wcex={0}

    wcex.cbSize = sizeof(WNDCLASSEX)        //WNDCLASSEX结构体大小

    wcex.style            = CS_HREDRAW | CS_VREDRAW    //位置改变时重绘

    wcex.lpfnWndProc    = (WNDPROC)WndProc            //消息处理函数

    wcex.hInstance        = 0            //当前实例句柄

    wcex.hbrBackground    = (HBRUSH)COLOR_WINDOWFRAME    //背景色

    wcex.lpszClassName    = szWindowClass        //参窗口类名

    wcex.hIcon            =0        //图标

    wcex.hCursor        =LoadCursor(NULL, IDC_ARROW)        //光标

    wcex.lpszMenuName    =0        //菜单名称

    wcex.hIconSm        =0        //最小化图标

    RegisterClassEx(&wcex)            //注册窗口类

 

    hWnd = CreateWindow(szWindowClass, szTitle, WS_SYSMENU|WS_VISIBLE,    //创建窗口

      CW_USEDEFAULT,CW_USEDEFAULT, 400, 300, NULL, NULL, 0, NULL)

    if (!hWnd){

      return FALSE

    }

 

    ShowWindow(hWnd, nCmdShow)

    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)

{

    PAINTSTRUCT ps

    HDC hdc

    RECT rect

    switch (message) 

    {   

        case WM_PAINT:        //重绘消息

            hdc = BeginPaint(hWnd, &ps)

            GetClientRect(hWnd, &rect)

            MoveToEx(hdc,10,10,0)

            SelectObject( hdc,::CreatePen(PS_SOLID,1,RGB(0xFF,0,0)))

            LineTo(hdc,100,200)

            //            DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER)

            EndPaint(hWnd, &ps)

            break

             

        case WM_CREATE:

             

            RegisterHotKey(hWnd ,1, 0 ,0x41 )

            break

        case WM_HOTKEY:

            MessageBox(0,0,0,0)

            break

        case WM_TIMER:

     

 

            break

        case WM_DESTROY:    //窗口销毁消息

            PostQuitMessage(0)

            break

        default:

            return DefWindowProc(hWnd, message, wParam, lParam)

   }

   return 0

}

1、C语言的应用很广的,比如 单片机,嵌入式,都需要C语言,而C语言也是非常合适类似开发的,这个是和硬件电路密切相关的,虽然很少用C语言开发可视化界面

(目前我没有用过),但可以控制各种硬件的运行动作。此外.C语言可以开发可视化的程序界面,但这是高级的C语言编程,需要继续学习才能了解的。更重要的

一点,学习C语言个人一种编程开发的思想,计算机的各种语言很多,但都有类似的地方,学过C语言在学习其他语言如java等就简单了.

2、下面是一个在windows窗体上显示树形图的程序。在vc6中新建win32工程(注意不是控制台)。然后新建c++源文件,粘贴代码进去,编译运行即可。

#include <windows.h>

#include <math.h>

#define AD 3.14159265*45/180//相邻树枝的旋转角度

#define Gold 0.618//相邻树枝的长度比例 范围0-1

#define Len 100 //树根的长度

HDC hdc

struct Node

{

double x//节点坐标x

double y//节点坐标y

double AM//节点的左右分支的中线方向

double Length//节点的原支长度

struct Node *LeftNode//左分支

struct Node *RightNode//右分支

}

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM)

void DL(double x1,double y1,double x2,double y2)

void DrawNode(struct Node *ThisNode)

void DrawTree (void)

//画一条直线

void DL(double x1,double y1,double x2,double y2)

{

MoveToEx (hdc, x1, y1, NULL) 

LineTo (hdc, x2, y2) 

}

void DrawNode(struct Node *ThisNode)

{

//左分支的地址、角度、长度、坐标

ThisNode->LeftNode=(struct Node *)malloc(sizeof(struct Node))

ThisNode->LeftNode->AM =ThisNode->AM +AD

ThisNode->LeftNode->Length =ThisNode->Length *Gold

ThisNode->LeftNode->x=ThisNode->x+cos(ThisNode->LeftNode->AM)*ThisNode->LeftNode->Length

ThisNode->LeftNode->y=ThisNode->y+sin(ThisNode->LeftNode->AM)*ThisNode->LeftNode->Length

//右分支的地址、角度、长度、坐标

ThisNode->RightNode=(struct Node *)malloc(sizeof(struct Node))

ThisNode->RightNode->AM =ThisNode->AM -AD

ThisNode->RightNode->Length =ThisNode->Length *Gold

ThisNode->RightNode->x=ThisNode->x+cos(ThisNode->RightNode->AM)*ThisNode->RightNode->Length

ThisNode->RightNode->y=ThisNode->y+sin(ThisNode->RightNode->AM)*ThisNode->RightNode->Length

//画图

DL(ThisNode->x,ThisNode->y,ThisNode->LeftNode->x,ThisNode->LeftNode->y)

DL(ThisNode->x,ThisNode->y,ThisNode->RightNode->x,ThisNode->RightNode->y)

//递归终点

if(ThisNode->Length>5 )

{

DrawNode(ThisNode->LeftNode)

DrawNode(ThisNode->RightNode)//

}

}

void DrawTree (void)

{

struct Node TreeRoot

TreeRoot.x =500//树根的横坐标

TreeRoot.y =Len

TreeRoot.AM =3.14159265/2

TreeRoot.Length =Len

DrawNode(&TreeRoot)

}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("SineWave") 

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 ("Program requires Windows NT!"),

szAppName, MB_ICONERROR) 

return 0 

}

hwnd = CreateWindow ( szAppName, TEXT ("Sine Wave Using Polyline"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL) 

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)

{

PAINTSTRUCT ps 

switch (message)

{

case WM_SIZE:

return 0 

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) 

DrawTree()

return 0 

case WM_DESTROY:

PostQuitMessage (0) 

return 0 

}

return DefWindowProc (hwnd, message, wParam, lParam) 

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7991487.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存