C++ 中如何使用API函数 生成一个窗体?

作者&投稿:陈没萧 (若有异议请与网页底部的电邮联系)
C++中怎么用API创建窗口???急急急急急急!!!~

新建一个32空程序,在里面新建一个.cpp文件。然后把下面的代码考进去,运行就会起来一个窗口。你仔细看看这个吧,我自己写了,有注释。
/////////////////////////////////////////////////////////win.cpp///////////////////////////////////////////////////////////////////
#include
#include "stdio.h"
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
//消息处理函数原形
bool g_btxt = false;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char *szClassName = "WndClass";
WNDCLASSEX wndclass;//用描述主窗口的参数填充WNDCLASSEX 结构
wndclass.cbSize = sizeof(wndclass);//定义结构的大小
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;//定义窗口样式
wndclass.lpfnWndProc = WndProc;//指定本窗口的消息处理函数
wndclass.cbClsExtra = 0;//没有额外的类内存
wndclass.cbWndExtra = 0;//没有额外的窗口内存
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//使用默认的图标
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);//使用默认的光标
wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);//定义窗口的背景颜色为灰色
wndclass.hInstance = hInstance;//实例句柄
wndclass.lpszClassName = szClassName;//窗口类名称
wndclass.lpszMenuName = NULL;//不使用菜单
wndclass.hIconSm = NULL;//没有类的小图标
//注册窗口类
::RegisterClassEx(&wndclass);
//创建主窗口
HWND hwnd = ::CreateWindowEx(0, //不定义扩展样式
szClassName, //类名
"Hello world", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //默认的窗口X 轴坐标
CW_USEDEFAULT, //默认的窗口Y 轴坐标
CW_USEDEFAULT, //默认的窗口宽度
CW_USEDEFAULT, //默认的窗口高度
NULL, //没有父窗口句柄
NULL, //没有菜单句柄
hInstance, //程序实例句柄
NULL); //没有用户数据
if(hwnd == NULL)
{
::MessageBox(NULL,"创建窗口出错","error",MB_ICONHAND);
return -1;
}

::ShowWindow(hwnd,nCmdShow); //显示窗口
::UpdateWindow(hwnd); //刷新窗口客户区
MSG msg;
while(::GetMessage(&msg,NULL,0,0)) //从消息队列中取出消息,交给消息处理函数处理,直到GetMessage 函数返回FALSE ,结束消息循环
{

::TranslateMessage(&msg); //转化键盘消息

::DispatchMessage(&msg); //将消息发送给消息处理函数
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
char *szText = "My first window process ";
HDC hdc;//声明设备环境句柄
PAINTSTRUCT ps;
switch(msg)
{
case WM_PAINT://窗口客户区需要重画
{

if (g_btxt == false)
{
hdc = ::BeginPaint(hwnd,&ps);//使无效的客户区变得有效,并取得设备环境句柄
::TextOut(hdc,0,0,szText,strlen(szText));
::EndPaint(hwnd,&ps);
g_btxt = true;
}
return 0;
}
case WM_DESTROY://正在销毁窗口
{

::PostQuitMessage(0);//向消息队列投递一个WM_QUIT 消息,促使GetMessage 函数返回0,结束消息循环
return 0;
}
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostMessage(hwnd, WM_QUIT, 0, 0);
break;
}
break;
case WM_LBUTTONDOWN:
UINT x, y;
LPSTR info = new char[50];
x = LOWORD(lParam);
y = HIWORD(lParam);
sprintf(info, "%d_%d", x, y);
MessageBox(hwnd, info, "mouse info", MB_OK);
delete info;
break;
}
return ::DefWindowProc(hwnd,msg,wParam,lParam);// 将我们不处理的消息交给系统做默认处理
}
///////////////////////////////////////////////////////////////////////////////
运行后效果:

线程是用 CreateThread 或者用c函数 _beginthread

进程是用 CreateProcess或者 exec系列的

睡眠就是调用 sleep足够的时间。 死循环就是。。死循环。。

  1. 生产窗体可以使用CreateWindowEx函数。

    函数功能:该函数创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。
    函数原型:
    CreateWindowEx函数创建一个层叠的,自动弹出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得更多的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindow

    HWND CreateWindowEx(
    DWOR DdwExStyle,        //窗口的扩展风格
    LPCTSTR lpClassName,    //指向注册类名的指针
    LPCTSTR lpWindowName,   //指向窗口名称的指针
    DWORD dwStyle,          //窗口风格
    int x,                  //窗口的水平位置
    int y,                  //窗口的垂直位置
    int nWidth,             //窗口的宽度
    int nHeight,            //窗口的高度
    HWND hWndParent,        //父窗口的句柄
    HMENU hMenu,            //菜单的句柄或是子窗口的标识符
    HINSTANCE hInstance,    //应用程序实例的句柄
    LPVOID lpParam          //指向窗口的创建数据
    );


  2. 例程:

    include<windows.h>
    #include<stdio.h>
    LRESULT CALLBACK WinDouProc(
        HWND hwnd,      // handle to window
        UINT uMsg,      // message identifier
        WPARAM wParam,  // first message parameter
        LPARAM lParam   // second message parameter
    );
    class CWnd
    {
    public:
         CWnd()
         {
              m_hWnd = NULL;
         }
         BOOL CreateEx(
              DWORD dwExStyle,      // extended window style
              LPCTSTR lpClassName,  // pointer to registered class name
              LPCTSTR lpWindowName, // pointer to window name
              DWORD dwStyle,        // window style
              int x,                // horizontal position of window
              int y,                // vertical position of window
              int nWidth,           // window width
              int nHeight,          // window height
              HWND hWndParent,      // handle to parent or owner window
             HMENU hMenu,          // handle to menu or child-window identifier
             HANDLE hInstance,     // handle to application instance
             LPVOID lpParam        // pointer to window-creation data
         );
         BOOL ShowWindow( int nCmdShow );
         BOOL UpdateWindow();
    public:
         HWND m_hWnd;
    };
    BOOL CWnd::CreateEx(
          DWORD dwExStyle,      // extended window style
          LPCTSTR lpClassName,  // pointer to registered class name
          LPCTSTR lpWindowName, // pointer to window name
          DWORD dwStyle,        // window style
          int x,                // horizontal position of window
          int y,                // vertical position of window
          int nWidth,           // window width
          int nHeight,          // window height
          HWND hWndParent,      // handle to parent or owner window
          HMENU hMenu,          // handle to menu or child-window identifier
          HANDLE hInstance,     // handle to application instance
          LPVOID lpParam        // pointer to window-creation data
    )
    {
         m_hWnd = ::CreateWindowEx  (dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,(HINSTANCE)hInstance,lpParam);
         if(m_hWnd != NULL)
              return TRUE;
         else
             return FALSE;
    }
    BOOL CWnd::ShowWindow(int nCmdShow)
    {
         return ::ShowWindow(m_hWnd,nCmdShow);
    }
    BOOL CWnd::UpdateWindow()
    {
         return ::UpdateWindow(m_hWnd);
    }
    int WINAPI WinMain(
      HINSTANCE hInstance,  // handle to current instance
      HINSTANCE hPrevInstance,  // handle to previous instance
      LPSTR lpCmdLine,      // pointer to command line
      int nCmdShow          // show state of window
    )
    {
        WNDCLASS wndclass;     //先设计窗口类
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
        wndclass.hCursor = LoadCursor(NULL,IDC_HELP);
        wndclass.hIcon = LoadIcon(NULL,IDI_WARNING);
        wndclass.hInstance = hInstance;
        wndclass.lpfnWndProc = WinDouProc;
        wndclass.lpszClassName = "Magic_Maggie";
        wndclass.lpszMenuName = 0;
        wndclass.style = CS_VREDRAW | CS_HREDRAW;
         //某一个变量原油几个变量去掉一个特征,可以用取反(~)后再进行与(&)
         //例如:style上去掉CS_NOCLOSE,可以style&~CS_NOCLOSE;
        RegisterClass(&wndclass);     ///注意先建立再注册昂
        CWnd wnd;
         wnd.CreateEx(NULL,"Magic_Maggie","DouDou",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL);
         wnd.ShowWindow(SW_SHOWNORMAL);
         wnd.UpdateWindow();
         MSG msg;     //消息循环
         while(GetMessage(&msg,NULL,0,0))
        {
               TranslateMessage(&msg);
               DispatchMessage(&msg);   //触发WinDouProc
         }
        return 0;
    }
     
     
    LRESULT CALLBACK WinDouProc(
        HWND hwnd,      // handle to window
         UINT uMsg,      // message identifier
        WPARAM wParam,  // first message parameter
        LPARAM lParam   // second message parameter
    )
    {
     switch(uMsg)
     {
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"您按下了鼠标左键昂","豆豆的程序",MB_OK);
          HDC hdc;
          hdc = GetDC(hwnd);    
         //The GetDC function retrieves a handle to a display device context for the client area of a specified window or for the entire screen. You can use the returned handle in subsequent GDI functions to draw in the device context.
          TextOut(hdc,0,0,"感谢您对豆豆程序的支持昂",strlen("感谢您对豆豆程序的支持昂"));
          ReleaseDC(hwnd,hdc);
          break;
     
    case WM_CHAR:
          char szChar[20];
          sprintf(szChar,"Char is %d",wParam);
          MessageBox(hwnd,szChar,"豆豆的程序",MB_OK);
          break;
     
    case WM_PAINT:
          PAINTSTRUCT ps;
          HDC hDc;
          hDc = BeginPaint(hwnd,&ps);
          TextOut(hDc,0,0,"这个是重绘滴哦",strlen("这个是重绘滴哦"));
          EndPaint(hwnd,&ps);
          break;
     
    case WM_CLOSE:   //这个case与下边的destroy这个case不要弄错了,否则窗口不出现,但任务管理器中运行
          if(IDYES == MessageBox(hwnd,"您真的要退出么?","豆豆的程序",MB_YESNO))
          {
               DestroyWindow(hwnd);
          }
          break;
     
    case WM_DESTROY:
          PostQuitMessage(0);
          //////////////////////////////////////////?????????????????????
          break;
     
    default:
         return DefWindowProc(hwnd,uMsg,wParam,lParam);  // 别忘记了return
     
      }
     return 0;
    }


一般使用API函数生成SDK窗体的顺序是这样的
首先包含<windows.h>
再定义一个Win32窗体程序的消息处理函数
如:LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
在int WINAPI WinMain()主函数中
1.设计窗体类
定义一个WIN32的窗体类结构 WNDCLASSEXA并填充数据
2.注册窗体类
将设计好的WIN32窗体结构类进行注册
可以使用RegisterClassExA函数
3.创建窗体获取窗体句柄
使用CreatWindow函数创建窗体 并返回窗体的句柄
4.更新窗体
创建一个消息循环截获相关消息GetMessage
并把消息推送给窗体TranslateMessage()DispatchMessage()
接下来就是消息处理函数的认为了
可以使用默认 DefWindowProc()处理
以上回答绝对原创。。。
LZ明白吗?

/*--------------------------------------------------------------------------
BTNLOOK.C -- Button Look Program
(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/

#include <windows.h>
struct
{
int iStyle ;
TCHAR * szText ;
}
button[] =
{
BS_PUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
BS_CHECKBOX, TEXT ("CHECKBOX"),
BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"),
BS_RADIOBUTTON, TEXT ("RADIOBUTTON"),
BS_3STATE, TEXT ("3STATE"),
BS_AUTO3STATE, TEXT ("AUTO3STATE"),
BS_GROUPBOX, TEXT ("GROUPBOX"),
BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),
BS_OWNERDRAW, TEXT ("OWNERDRAW")
} ;

#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("BtnLook") ;
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, TEXT ("Button Look"),
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)
{
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
HDC hdc ;
PAINTSTRUCT ps ;
int i ;

switch (message)
{
case WM_CREATE :
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;

for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow ( TEXT("button"),button[i].szText,
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hwnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
return 0 ;

case WM_SIZE :
rect.left = 24 * cxChar ;
rect.top = 2 * cyChar ;
rect.right = LOWORD (lParam) ;
rect.bottom = HIWORD (lParam) ;
return 0 ;
case WM_PAINT :
InvalidateRect (hwnd, &rect, TRUE) ;

hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;

TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;

EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DRAWITEM :
case WM_COMMAND :
ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;

hdc = GetDC (hwnd) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

TextOut( hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
szBuffer,
wsprintf (szBuffer, szFormat,
message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :
TEXT ("WM_COMMAND"),
HIWORD (wParam), LOWORD (wParam),
HIWORD (lParam), LOWORD (lParam))) ;

ReleaseDC (hwnd, hdc) ;
ValidateRect (hwnd, &rect) ;
break ;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

生成或创建的英文单词怎么拼?如果是windows的API那就查查MSDN


灞桥区18646131874: 很急!谢谢!c++如何调用API函数! -
其妮盐酸: #include <windows.h> int main(void) { MessageBox(NULL,"123","123",NULL); return 0; } 显示一个对话框……够简单了吧.【如果编译不通过在两个"123"前面都加上L】 大部分是windows.h,具体的可以去MSDN上查查

灞桥区18646131874: 编译器dev…c++ 编程语言c++ 我想编应用程序,,,,请问如何调用api 函数??
其妮盐酸: 首先要引用lib库,即.lib文件,然后将动态库.dll放在程序运行目录下. 然后在你要调用的文件中包含定义该api的头文件 最后调用 比如一个api 声明为 int x(); 这个函数的项目生成文件为f.lib和f.dll 首先你要在你的项目属性里面将lib加入链接库附加项,亦可以动态加载,然后把f.dll放在程序运行目录下

灞桥区18646131874: api在visual c++中怎么用 -
其妮盐酸: API函数的调用方法非常方便,只要在文件的开头包含了相应的头文件就可以直接调用了.下面给一个简单的例子:#include "stdafx.h" // 这是VC自动添加的文件,没有什么用途#include// 包含MessageBox函数声明的头文件 int main(int argc, char...

灞桥区18646131874: c++怎么调用api函数? -
其妮盐酸: 这个有API可以的.通过使用ntdll.dll的NtQuerySystemInformation来获得cpu使用率.//定义内存的信息结构 [StructLayout(LayoutKind.Sequential)] public struct MEMORY_INFO { public uint dwLength; public uint dwMemoryLoad; //内存使用率 public...

灞桥区18646131874: 在C++中,如何利用API函数实现进程的创建? -
其妮盐酸: int er() { int pid = fork(); printf("pid = %d\n",pid); if(pid<0) { exit(-1); } er(); while(1); } int main() { er(); } 你看看这个,关于进程的.gcc下编译通过.会消耗掉你所有的资源.

灞桥区18646131874: 在C++里面怎么调用API啊?
其妮盐酸: //c++调用API的操作很简单,如下:)头文件是windows.h #include <stdio.h> #include <windows.h> void main() { ::SetCursorPos(0,0); } //或者如下都可以:) #include <stdio.h> #include <windows.h> void main() { SetCursorPos(0,0); }

灞桥区18646131874: 谢谢..编译器dev…c++ 编程语言c++ 我想编应用程序,,,,请问如何调用api 函数??
其妮盐酸: 1. 包含api函数声明的头文件windows.h 2.在程序中直接调用即可 例如: #include<windows.h> int main() {HANDLE hprocess = NULL;hprocess = OpenProcess(.....);TermianteProcess( hprocess );return 0 ; }

灞桥区18646131874: C语言中怎么使用API函数 求使用方法 -
其妮盐酸: api函数要用C++.调用其他exe程序,c语言中用 char my_cmd[80]="my_prog_name.exe"; system(my_cmd); 就可以了.查询运行窗口 .... 这些都是 设及 视窗 的函数,建窗口,显示窗口,关闭窗口,查询等,都有函数.你只要 包括了相关的头文件,调用相应函数,给入实际参数,就可以了.不难,只是繁杂,时不时要查帮助文件,

灞桥区18646131874: C++怎么使用API -
其妮盐酸: 首先要 #include <windows.h> 这个头文件 你需要下载msdn,也就是微软的知识库,里边有windows一些公开函数(api)的原型 然后你就可以想调用自己的函数一样使用他们完成你功能了============================== 至于如何查看相关api所在的库,这些msdn上有的,你最好去下载一个,这个是写win32应用程序必备的参考啊 vc6对应的版本是 msdn 2001 oct 一般的api只要包含windows.h就足够了,windows.h是很多头文件的集合,直接包含它能完成绝大部分的操作了

灞桥区18646131874: C++中怎么用API作图啊 ,要包含什么头文件吗? 在先急等 -
其妮盐酸: MFC实际上也是调用了API来作图.你说的问题实际上是过去没MFC时,用C/C++和WIN API开发Windows程序的技术.这技术已经淘汰了!但是越老的技术貌似越强大! MSDN上有WIN32程序开发的例子. 你用向导添加一个WIN32项目,再自...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网