既然每个程序都需要注册窗口类,3)    创建窗口

就算在访问成员变量之前把对象指针压入堆栈,访问成员变量时它们的地址是基于对象的地址叠加计算的,//    norains,即 char,LPSTR,3)    创建窗口,Win32 API是用于创建 Windows,既然每个程序都需要注册窗口类,Window类的头文件                        

自己的一点有关把WndProc指向类的分子函数的见地,wndproc指向

  作者原先经常思虑使用WNDCLASS、CreateThread之类的Windows
API时怎么在类里面调用,传入函数参数地址时怎样选用成员函数的地方。为了研商,写了多个演示代码:

#include <iostream>
#include <stdio.h>

using namespace std;

typedef int (__stdcall *XSSH_SAY_HELLO)(int);

class XTestMethod
{
 typedef int (__stdcall XTestMethod::*XSayHello)(int);
public:
 XSayHello say;
 int hi;
public:
 XTestMethod();
 virtual ~XTestMethod();
 int sayhello(int arg);
};

XTestMethod::XTestMethod()
{
 say=&XTestMethod::sayhello;
 hi=1000;
}

XTestMethod::~XTestMethod()
{

}

int XTestMethod::sayhello(int arg)
{
 printf("\r\nsay:%d%d\r\n",arg,this->hi);
}

int main(int argc, char *argv[])
{
 XTestMethod t;
 XSSH_SAY_HELLO call=*(XSSH_SAY_HELLO*)&t.say;
 call(0);
 system("pause");
 return 0;
}

  

  调节和测验的时候发掘在调用类的积极分子从前货仓里的this指针是空的,输入之后输出结果的值前面一个是即兴的,前者直接待上访谈出错(空援用)。

  对于成员函数与成员变量来说,同一品种的两样对象的如出一辙成员变量的偏移地址是均等的,访谈成员变量时它们的地点是遵照对象的地点叠加总结的,假诺用上述办法步入成员函数进而方问成员变量,那么访谈出错。固然在拜谒成员变量在此之前把目的指针压入货仓,不仅仅要思考压入哪个指标的地点,并且这么使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在选拔目标上从来不差别,失去了面象对象的含义。

//========================================================================
//TITLE:
//    在非主线程中开创窗口
//AUTHOR:
//    norains
//DATE:
//    Saturday  29-December-2007
//Environment:
//    VS2005 + SDK-WINCE5.0-MIPSII  
//========================================================================

Windows程序的内部运行原理

Win32应用程序的为主组织,win32主旨结构


vc++ WndProc的参数怎传给类成员函数?

很简短,就像平时函数那样操作就能够。
 

  
很多对象都会有过这么的经验,为啥在主线程中创立窗口且窗口办事很正规,但一移到非主线程(有的朋友喜欢叫它为办事线程),却束手无策符合规律职业.本文就那些难点和各位商讨,大概不可能成功优质,但能进行试探也总算欣慰了.
  
   在主线程中开创三个可见健康工作的窗口,臆度地球人都知道.
  
   那是一段职业通常化的代码: 

读书了MFC的一部分理论性知识和实际的操作使用!

0 引言

Win32 API是用来创立 Windows
应用程序的应用程序编制程序接口。常常情形下,多个Win32运用包括一下多少个部分:

1)    应用程序入口;

2)    注册窗口类;

3)    创制窗口;

4)    呈现窗口;

5)    更新窗口

6)    音讯循环;

7)    派发新闻;

 

对此窗口进程函数WndProc

WndProc在WinMain里面未有一向调用,可是它被直接调用。下边包车型地铁新闻循环一再被叫作主音讯循环,是Win32顺序使得的来自,全体的Win32先后都会有类似的巡回(MFC也不例外,在CWinThread::Run函数里面):

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

你的WndProc看起来就像是和下边包车型地铁代码压根未有关联,但是奥密就在DispatchMessage里面,那几个函数的职能和她名字一样,是散发消息的,全部的窗口句柄都对应一个窗口进度函数,每一种音信的窗口句柄则是在那么些MSG结构中保留的,DispatchMessage的源代码纵然从未驾驭,然则差十分少能够无可置疑,他先调用Windows
API函数GetWindowLongPtr加上参数GWLP_WNDPROC,就足以拿走窗口句柄所对应的窗口函数指针,接下去她就调用那些窗口函数。所以窗口函数被那几个主音讯循环直接调用了。当GetMessage得到的MSG结构中的窗口句柄是NULL的时候,DispatchMessage不调用任何窗口进度函数。
 

我原先日常思索选拔WNDCLASS、CreateThread之类的Windows
API时怎么样在类里面调用,传入…

#include “windows.h”

以下是理论知识:

char:是ANSI字符的数据类型

wchar_t:是Unicode字符的数据类型

TCHAENCORE:同期协理三种字符串

LPSTR:即 char *,指向以’/0’结尾的8位(单字节)ANSI字符数组指针

LPWSTR:即wchar_t *,指向’/0’结尾的13人(双字节)Unicode字符数组指针?

LPCSTR:即const char *

LPCWSTR:即const wchar_t *?

LPTSTHaval:LPST宝马X3与LPWST君越两个二选一,取决于是还是不是宏定义了UNICODE或ANSI

LPCTSTENVISION:?LPCSTLacrosse与LPCWST兰德凯雷德两个二选一,取决于是不是宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:

Windows程序设计是一种事件驱动的顺序设计艺术。首如果依赖音讯的。当用户必要完结某种意义时,会调用操作系统的某种扶助,操作系统将用户的内需包装成某种新闻,并投递到音信队列当中。然后利用应用程序从新闻队列中取走音信并拓展响应

音信循环的管理进程

MSG  msg;

While (GetMessage(&msg,NULL, 0,0))

{  TranslateMessage(&msg);

DispatchMessage(&msg);

}

(1)
GetMessage()函数不断考察应用程序的音讯队列,若队列为空,则该函数一贯运转,不回去;一旦发觉队列不为空,便抽出一条新闻,把它复制到msg结构变量中,相同的时间该函数再次回到TRUE。

(2)
获得新闻msg后,TranslateMessage()把来自键盘的吩咐翻译成WM_XXX音讯命令方式。

(3)
DispatchMessage()函数通告Windows把种种音讯分发给相应的窗口函数。应用程序并不间接调用窗口函数,而由Windows依照信息去调用窗口函数,因而,窗口函数日常被称之为回调函数。

Windows32应用程序开垦进度

1创建应用程序

2编写WinMain 函数

窗口的创造

(1)设计一个窗口类

(2)注册窗口类

(3)创造窗口实例

(4)展现及更新窗口

应用程序的新闻循环管理

MSG  msg;

While (GetMessage(&msg,NULL, 0,0))

{  TranslateMessage(&msg);

DispatchMessage(&msg);

}

概念窗口类的布局

typedef struct _WNDCLASS { �UINT style;            //窗口类的品格

�WNDPROC lpfnWndProc; //窗口管理函数

�int cbClsExtra;      //窗口类附加数据大小

�int cbWndExtra;    //窗口附加数据大小

�HANDLE hInstance; //当前应用程序的实例句柄

�HICON hIcon;      //窗口Logo

HCUEvoqueSO巴博斯 CL级 hCursor;          //窗口的鼠标

�HBRUSH hbrBackground; //窗口的背景画刷

�LPCTSTR lpszMenuName; //菜单

�LPCTSTCR-V lpszClassName; //窗口类名称

} WNDCLASS;

(2)窗口类的登记

三个窗口,在开创从前须求先向操作系统进行登记,那好像现实生活中大家开公司,要先向工商行政管理局举办挂号同样。

?大家透过RegisterClassEx()那么些API将窗口类在操作系统中举行登记,并通过其重回值判定是不是注册成功。

窗口挂号

if ( !RegisterClass(&wndclass) )

{

//新闻对话框

MessageBox(NULL, _T(“注册窗口类退步!”), _T(“错误音信”),
MB_ICONERROR);

return 0;

}

(3)窗口的创建API

HWND?hWnd?=?CreateWindow(

_T(“MyWindowClass”),       //窗口类名称

_T(“Window API编制程序”),                  //窗口名称,窗口标题

WS_OVE奥迪Q5L应用程式EDWINDOW,      //窗口类型

CW_USEDEFAULT, ? //窗口的左上角X坐边

CW_USEDEFAULT,? //窗口的左上角X坐边

CW_USEDEFAULT, ?//窗口的小幅

CW_USEDEFAULT,? //窗口的惊人

NULL,? //父窗口句柄

NULL, //窗口菜单句柄

hInstance, //应用程序的实例句柄

NULL  //创立的参数,一般为NULL

);

(4)窗口的来得与更新

窗口的展现与更新

ShowWindow(hwnd,SW_SHOW);

UpdateWindow(hwnd);

MFC中CString字符串类

1.CString 类对象的起首化:

CString str;

CString str1(_T(“HelloWorld “));

CString str2 = _T(“HelloWorld”);

2.取字符串长度成员函数:GetLength();

CString str(_T(“abc”));  int len = str.GetLength(); //len == 3

3.字符串的连天:+、+=

CString str(_T(“abc”));

str = _T(“de”) + str + _T(“kp”); //str == deabckp

TCHAR szBuf[] = _T(“789”);

str += szBuf; //str == deabckp123789

4.去除空格成员函数: Trim();

CString str (_T(“    HelloWorld    “));      str1.Trim();

5.字符串的比较:==、!=

CString str1(_T(“abc”));    CString str2 = _T(“aBc”);

if (str1 == str2)

MessageBox(_T(“str1 等于 str2”));

else

MessageBox(_T(“str1 不等于 str2”));

  1. CString 对象类型的改造:

格式化字符串:Format 方法,达成从 int、long 等数值类型、TCHAEscort、TCHAPAJERO *
等品类向 CString 类型的转变;

int num = 6;      CString str;      str.Format(_T(“%d”), num);

CString 类型向 int 等数值类型

CString str1(_T(“123”));      int num = _ttoi(str1);

1 应用程序入口

      Win32应用程序以WinMain函数作为程序入口,函数原型如下:

int WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow);

WIN32.02.校勘版的Win32应用程序-封装

HWND g_hWnd = NULL;
HINSTANCE g_hInst;

2 注册窗口类

     
注册窗口类供给提供自定义的窗口类名,通过此窗口类名创设的窗口,操作系统会将消息投递至注册窗口类时内定的窗口进度函数。

      Win32应用程序使用RegisterClassEx注册窗口类,函数原型如下:

ATOM RegisterClassEx(CONST WNDCLASSEX* pWndClass);

大家用Visual
Studio创制贰个win32项目上会自动生成贰个注册窗口的函数,函数达成如下:

ATOM MyRegisterClass(HINSTANCE hInstance)

{

       WNDCLASSEX wcex;

       wcex.cbSize = sizeof(WNDCLASSEX);

       wcex.style = CS_HREDRAW | CS_VREDRAW;

       wcex.lpfnWndProc = WndProc;

       wcex.cbClsExtra = 0;

       wcex.cbWndExtra = 0;

       wcex.hInstance = hInstance;

       wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SKINUI));

       wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);

       wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

       wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SKINUI);

       wcex.lpszClassName = szWindowClass;

       wcex.hIconSm    = LoadIcon(wcex.hInstance,
MAKEINTRESOURCE(IDI_SMALL));

       return RegisterClassEx(&wcex);

}

既然如此种种程序都急需登记窗口类,都亟待CreateWindow、UpdateWidow、ShowWindow,那么大家应有把注册窗口类和窗口管理局地各自写入分化的函数,以方便调用。最佳,大家有多少个Window类实现那么些效应。

LRESULT WndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
    return DefWindowProc(hWnd,wMsg,wParam,lParam);
}

3 创造窗口

Win32应用程序使用CreateWindowEx创造窗口,函数原型如下:

HWND CreateWindowExW(

    __in DWORD dwExStyle,

    __in_opt LPCWSTR lpClassName,

    __in_opt LPCWSTR lpWindowName,

    __in DWORD dwStyle,

    __in int X,

    __in int Y,

    __in int nWidth,

    __in int nHeight,

    __in_opt HWND hWndParent,

    __in_opt HMENU hMenu,

    __in_opt HINSTANCE hInstance,

__in_opt LPVOID lpParam);

 

void CreateWnd(void)
{    

4 展现窗口

Win32应用程序使用ShowWindow呈现窗口,函数原型如下:

BOOL ShowWindow(__in HWND hWnd,  __in int nCmdShow);

/************************************************************************/

    WNDCLASS wc = {0};
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = g_hInst;
    wc.hIcon         = NULL; 
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = TEXT(“SimpleWindow”);

5 更新窗口

Win32应用程序使用UpdateWindow更新窗口,函数原型如下:

BOOL UpdateWindow(__in HWND hWnd);

/*
Win32Imp.h :Window类的头文件                        
                                            */

    RegisterClass(&wc);

6 新闻循环

各样Win32应用程序都亟待至少三个音讯循环,结构如下:

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

    {

           if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

           {

                  TranslateMessage(&msg);

                  DispatchMessage(&msg);

           }

    }

函数原型就不在此一一列出,具体仿效MSDN。

/************************************************************************/

    g_hWnd = CreateWindowEx(0,
                TEXT(“SimpleWindow”),
                TEXT(“SimpleWindow”),
                WS_VISIBLE,
                0,
                0,
                200,
                200,
                NULL, 
                NULL, 
                g_hInst, 
                0);
}

7 派发音信

窗口进度函数用来选用系统投递的新闻,Win32应用程序在此派发音信。三个卓越的窗口进程函数如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)

{

       int wmId, wmEvent;

       PAINTSTRUCT ps;

       HDC hdc;

       switch (message)

       {

       case WM_COMMAND:

              wmId    = LOWORD(wParam);

              wmEvent = HIWORD(wParam);

              // Parse the menu selections:

              switch (wmId)

              {

              case IDM_ABOUT:

                     DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX),
hWnd, About);

                     break;

              case IDM_EXIT:

                     DestroyWindow(hWnd);

                     break;

              default:

                     return DefWindowProc(hWnd, message, wParam,
lParam);

              }

              break;

       case WM_PAINT:

              hdc = BeginPaint(hWnd, &ps);

              // TODO: Add any drawing code here…

              EndPaint(hWnd, &ps);

              break;

       case WM_DESTROY:

              PostQuitMessage(0);

              break;

       default:

              return DefWindowProc(hWnd, message, wParam, lParam);

       }

       return 0;

}

#include
<windows.h>

int WINAPI WinMain(    HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
     // TODO: Place code here.
    
    g_hInst = hInstance;

8 结束语

经过上述各部分的整合,贰个粗略的Win32应用程序就形成了。具体代码如下:

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR
lpCmdLine, int nCmdShow)

{

       UNREFERENCED_PARAMETER(hPrevInstance);

       UNREFERENCED_PARAMETER(lpCmdLine);

       MyRegisterClass(hInstance);

HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

       if(!hWnd)

       {

              return FALSE;

       }

       ShowWindow(hWnd, nCmdShow);

       UpdateWindow(hWnd);

       MSG msg;

       while(GetMessage(&msg, NULL, 0, 0))

       {

              if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

              {

                     TranslateMessage(&msg);

                     DispatchMessage(&msg);

              }

       }

       return (int)msg.wParam;

}

0 引言
Win32 API是用以创造 Windows
应用程序的应用程序编制程序接口。常常状态下,叁个Win32采取富含一下…

 

    CreateWnd();

class
Window

    //The message loop    
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

{

    return 0;
}

private:

   
如若大家创造四个线程,然后在那些线程中开创窗口,看看带给我们的是如何:

      
TCHAR *ClassName;

 
#include “windows.h”

      
TCHAR *AppName;

HWND g_hWnd = NULL;
HINSTANCE g_hInst;

      

LRESULT WndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
    return DefWindowProc(hWnd,wMsg,wParam,lParam);
}

public:

void CreateWnd(void)
{    

      
Window(TCHAR* classname, TCHAR* appname);

    WNDCLASS wc = {0};
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = g_hInst;
    wc.hIcon         = NULL; 
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = TEXT(“SimpleWindow”);

 

    RegisterClass(&wc);

      
/* InitApplication:完结窗口类的登记,输入实例句柄和窗口进程地址;失利再次回到FALSE   
*/

    g_hWnd = CreateWindowEx(0,
                TEXT(“SimpleWindow”),
                TEXT(“SimpleWindow”),
                WS_VISIBLE,
                0,
                0,
                200,
                200,
                NULL, 
                NULL, 
                g_hInst, 
                0);
}

      
BOOL InitApplication(HINSTANCE hInstance, WNDPROC WndProc );

DWORD CreateThread(PVOID pArg)
{
    CreateWnd();
    return 0;
}

 

int WINAPI WinMain(    HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
     // TODO: Place code here.
    
    g_hInst = hInstance;

      
/* InitInstance:CreateWindow、ShowWindow、UpdateWindow;失利重返FALSE,成功重返窗口句柄*/

    HANDLE hThrd = CreateThread(NULL,0,CreateThread,NULL,0,NULL);
    CloseHandle(hThrd);

      
HWND InitInstance(HINSTANCE hInstance, int nCmdShow);

    //The message loop    
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }