UTF-16LE 和 UTF-16BE
C/C++ 2-5 7浏览 0评论UTF-16LE 和 UTF-16BE 都是双字节编码,但它们的主要区别在于字节顺序(即字节的排列顺序)。 UTF-16 的基本特性 双字节编码: UTF-16 使用 2个字节(16位) 来表示一个字符。 对于超出基本多语言平面(BMP,即 U+0000 到 U+FFFF)的字符,UTF-16 使用 4个字节(代理对,Surrogate Pair) 来表示。 字节顺序: UTF-16 有两种字节顺序: UTF-16LE(Little Endian):低字节在前,高字节在后。 UTF-16BE(Big Endian):高字节在前,低字节在后。 UTF-16LE 和 UTF-16BE 的区别 1. UTF-16LE(Little Endian) 字节顺序:低字节在前,高字节在后。 例如,字符 A(Unicode 码点 U+0041)的编码为: 低字节:0x41 高字节:0x00 存储顺序:0x41 0x00 2. UTF-16BE(Big Endian) 字节顺序:高字节在前,低字节在后。 例如,字符 A(Unicode 码点 U+0041)的编码为: 高字节:0x00 低字节:0x41 存储顺序:0x00 0x41 BOM(字节顺序标记) UTF-16 文件通常以 BOM(Byte Order Mark) 开头,用于指示字节顺序: UTF-16LE 的 BOM 是 0xFF 0xFE。 UTF-16BE 的 BOM 是 0xFE 0xFF。 如果没有 BOM,则需要通过其他方式推断字节顺序。 示例 以下是一个简单的示例,展示 UTF-16LE 和 UTF-16BE 的编码差异: 字符:A(Unicode 码点 U+0041) UTF-16LE:0x41 0x00 UTF-16BE:0x00 0x41 字符:汉(Unicode 码点 U+6C49) UTF-16LE:0x49 0x6C UTF-16BE:0x6C 0x49 总结 UTF-16LE 和 UTF-16BE 都是双字节编码,但它们的字节顺序相反。 对于超出 BMP 的字符(如 Emoji),UTF-16 使用 4 个字节(代理对)表示。 通过 BOM 可以区分 UTF-16LE 和 UTF-16BE。 希望这个解释能帮助你更好地理解 UTF-16LE 和 UTF-16BE 的区别!如果还有其他问题,欢迎随时提问!
C++ std
C/C++ 2-4 16浏览 0评论C++ 标准库(std 库)是 C++ 语言的核心组成部分,提供了丰富的功能,包括容器、算法、字符串处理、输入输出、多线程支持等。std 是标准库的命名空间,所有标准库的类和函数都定义在这个命名空间中。 以下是 C++ 标准库的主要组成部分和功能的详细介绍: 1. 容器(Containers) 容器是用于存储数据的类模板,提供了多种数据结构。 顺序容器 std::vector:动态数组,支持快速随机访问。 std::array:固定大小的数组,封装了 C 风格数组。 std::deque:双端队列,支持快速头尾插入和删除。 std::list:双向链表,支持高效插入和删除。 std::forward_list:单向链表,内存占用更小。 关联容器 std::set:有序集合,元素唯一。 std::multiset:有序集合,允许重复元素。 std::map:有序键值对,键唯一。 std::multimap:有序键值对,允许重复键。 无序容器(C++11 引入) std::unordered_set:哈希集合,元素唯一。 std::unordered_multiset:哈希集合,允许重复元素。 std::unordered_map:哈希键值对,键唯一。 std::unordered_multimap:哈希键值对,允许重复键。 2. 算法(Algorithms) 算法是用于操作容器中数据的函数模板,定义在 <algorithm> 头文件中。 常用算法 std::sort:对容器中的元素进行排序。 std::find:查找容器中的元素。 std::copy:复制容器中的元素。 std::transform:对容器中的元素进行转换。 std::accumulate:计算容器中元素的累加值。 std::for_each:对容器中的每个元素执行操作。 示例 #include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> vec = {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end()); // 排序 for (int x : vec) { std::cout << x << " "; // 输出:1 2 3 4 5 } return 0; } 3. 字符串处理(Strings) std::string 是用于处理字符串的类,定义在 <string> 头文件中。 常用功能 std::string:表示一个字符串。 std::wstring:表示一个宽字符字符串。 std::to_string:将数值转换为字符串。 std::stoi、std::stol、std::stoll:将字符串转换为整数。 std::stof、std::stod、std::stold:将字符串转换为浮点数。 示例 #include <string> #include <iostream> int main() { std::string str = "Hello, World!"; std::cout << str.substr(0, 5) << std::endl; // 输出:Hello return 0; } 4. 输入输出(Input/Output) C++ 标准库提供了强大的输入输出功能,定义在 <iostream> 头文件中。 常用类 std::cin:标准输入流。 std::cout:标准输出流。 std::cerr:标准错误流。 std::ifstream:文件输入流。 std::ofstream:文件输出流。 std::stringstream:字符串流。 示例 #include <iostream> #include <fstream> int main() { std::ofstream file("test.txt"); file << "Hello, File!" << std::endl; file.close(); std::ifstream inFile("test.txt"); std::string line; std::getline(inFile, line); std::cout << line << std::endl; // 输出:Hello, File! return 0; } 5. 智能指针(Smart Pointers) 智能指针用于自动管理动态内存,定义在 <memory> 头文件中。 常用智能指针 std::unique_ptr:独占所有权的智能指针。 std::shared_ptr:共享所有权的智能指针。 std::weak_ptr:弱引用智能指针,用于解决循环引用问题。 示例 #include <memory> #include <iostream> int main() { std::unique_ptr<int> ptr = std::make_unique<int>(42); std::cout << *ptr << std::endl; // 输出:42 return 0; } 6. 多线程支持(Multithreading) C++11 引入了多线程支持,定义在 <thread> 头文件中。 常用类 std::thread:表示一个线程。 std::mutex:互斥锁,用于线程同步。 std::lock_guard:RAII 风格的互斥锁管理。 std::condition_variable:条件变量,用于线程间通信。 示例 #include <thread> #include <iostream> void task() { std::cout << "Hello from thread!" << std::endl; } int main() { std::thread t(task); t.join(); // 等待线程结束 return 0; } 7. 时间处理(Chrono) std::chrono 是用于时间处理的库,定义在 <chrono> 头文件中。 常用功能 std::chrono::system_clock:系统时钟。 std::chrono::steady_clock:稳定时钟。 std::chrono::duration:表示时间间隔。 std::chrono::time_point:表示时间点。 示例 #include <chrono> #include <thread> #include <iostream> int main() { auto start = std::chrono::steady_clock::now(); std::this_thread::sleep_for(std::chrono::seconds(1)); auto end = std::chrono::steady_clock::now(); std::cout << "Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl; return 0; } 8. 其他功能 std::function:用于存储可调用对象(函数、Lambda 表达式等)。 std::tuple:用于存储多个不同类型的值。 std::optional(C++17):表示一个可能不存在的值。 std::variant(C++17):表示一个可以存储多种类型的值。 总结 C++ 标准库(std 库)提供了丰富的功能,涵盖了容器、算法、字符串处理、输入输出、智能指针、多线程、时间处理等方面。它是 C++ 开发中不可或缺的工具,能够显著提高开发效率和代码质量。 如果你对某个部分特别感兴趣,可以告诉我,我会提供更详细的解释和示例! 😊
LOGFONT
C/C++ 1-25 31浏览 0评论LOGFONT lf; ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 20; // 字体大小 lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; // 字体粗细 lf.lfItalic = FALSE; // 是否斜体 lf.lfUnderline = FALSE; // 是否下划线 lf.lfStrikeOut = FALSE; // 是否删除线 lf.lfCharSet = DEFAULT_CHARSET; // 字符集 lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; lstrcpy(lf.lfFaceName, _T("Arial")); // 字体名称 fClipPrecision是LOGFONT结构中的一个字段,用于指定剪辑精度。它定义了当字符的一部分超过剪辑区域时对字符的剪辑方式。在Windows字体设置中,fClipPrecision的值决定了字符的剪辑方式,确保字符的显示不会超出指定的区域 具体来说,fClipPrecision字段有以下几种可能的值: 常量 说明 CLIP_DEFAULT 使用系统的默认剪辑方式。 CLIP_CHARACTER_OUTLINE 剪辑字符的轮廓,确保字符不会超出剪辑区域。 CLIP_STROKE 剪辑字符的轮廓和边缘,适用于需要更精确控制字符显示的情况。 CLIP_EMBEDDED 将字符嵌入到剪辑区域中,确保字符完全在区域内显示。 CLIP_LH_ANGLES 根据字符的基线角度进行剪辑,适用于特定方向的文本显示需求。
ImmGetConversionStatus 函数(imm.h)
C/C++ 1-25 16浏览 0评论检索当前转换状态。 BOOL ImmGetConversionStatus( HIMC unnamedParam1, [out, optional] LPDWORD lpfdwConversion, [out, optional] LPDWORD lpfdwSentence ); 参数 unnamedParam1 [out, optional] lpfdwConversion 指向变量的指针,函数在该变量中检索转换模式值的组合。 有关详细信息,请参阅 输入法转换模式值。 [out, optional] lpfdwSentence 指向函数检索句子模式值的变量的指针。 有关详细信息,请参阅 输入法句子模式值。 返回值 如果成功,则返回非零值,否则返回 0。 注解 仅当 IME 支持这些模式时,才会设置转换和句子模式值。 https://learn.microsoft.com/zh-cn/windows/win32/api/imm/nf-imm-immgetconversionstatus
ImmSetConversionStatus 函数 (imm.h)
C/C++ 1-25 17浏览 0评论设置当前转换状态。 BOOL ImmSetConversionStatus( [in] HIMC unnamedParam1, [in] DWORD unnamedParam2, [in] DWORD unnamedParam3 ); 参数 [in] unnamedParam1 输入上下文的句柄。 [in] unnamedParam2 转换模式值。 有关详细信息,请参阅 IME 转换模式值。 [in] unnamedParam3 句子模式值。 有关详细信息,请参阅 IME 句子模式值。 返回值 如果成功,则返回非零值,否则返回 0。 https://learn.microsoft.com/zh-cn/windows/win32/api/imm/nf-imm-immsetconversionstatus
输入法句子模式值
C/C++ 1-25 17浏览 0评论这些值与 ImmGetConversionStatus 和 ImmSetConversionStatus 函数一起使用。 常数 定义 IME_SMODE_AUTOMATIC IME 在自动模式下执行转换处理。 IME_SMODE_NONE 没有句子信息。 IME_SMODE_PHRASEPREDICT IME 使用短语信息来预测下一个字符。 IME_SMODE_PLURALCLAUSE IME 使用复数子句信息来执行转换处理。 IME_SMODE_SINGLECONVERT IME 在单字符模式下执行转换处理。 IME_SMODE_CONVERSATION 输入法使用对话模式。 这对于聊天应用程序很有用。 16 到 31 位保留供输入法使用。
IME 转换模式值
C/C++ 1-25 21浏览 0评论这些值与 ImmGetConversionStatus 和 ImmSetConversionStatus 函数一起使用。 bit 含义 IME_CMODE_ALPHANUMERIC 字母数字输入模式。 这是默认设置,定义为 0x0000。 IME_CMODE_CHARCODE 如果字符代码输入模式,则设置为 1;如果不是,则为 0。 IME_CMODE_EUDC 如果 EUDC 转换模式,则设置为 1;如果不是,则为 0。 IME_CMODE_FIXED Windows Me/98、Windows 2000、Windows XP: 如果固定转换模式,则设置为 1;如果不是,则为 0。 IME_CMODE_FULLSHAPE 如果全形状模式,则设置为 1;如果半形状模式,则为 0。 IME_CMODE_HANJACONVERT 如果 HANJA 转换模式,则设置为 1;如果不是,则为 0。 IME_CMODE_KATAKANA 如果片假名模式,则设置为 1;如果平假名模式,则为 0。 IME_CMODE_NATIVE 如果 NATIVE 模式,则设置为 1;如果 ALPHANUMERIC 模式,则为 0。 IME_CMODE_NOCONVERSION 设置为 1 可阻止 IME 处理转换;如果不是,则为 0。 IME_CMODE_ROMAN 如果 ROMAN 输入模式,则设置为 1;如果不是,则为 0。 IME_CMODE_SOFTKBD 如果软键盘模式,则设置为 1;如果不是,则为 0。 IME_CMODE_SYMBOL 如果 SYMBOL 转换模式,则设置为 1;如果不是,则为 0。 所有其他位是保留的。
c/c++ socket函数详解
C/C++ 10-22 542浏览 0评论注意: 使用socketAPI前,要先将相关链接库(Ws2_32.lib)加入链接,并使用WSAStartUp函数初始化。 在linux中地址结构体sockaddr的结构与windows的不太一样,具体请百度 每个socket函数都可能失败(返回-1),需要判断结果 socket分成两种: 一种专门用来监听新链接(或新活动),这种socket叫做master socket,一般只存在于服务器 一种专门用来收发数据,这种socket叫做connected socket,客户端和服务器都存在 int socket(int af,int type,int protocol); // 建立一个socket用于连接 af:address family,如AF_INET type:连接类型,通常是SOCK_STREAM或SOCK_DGRAM protocol:协议类型,通常是IPPROTO_TCP或IPPROTO_UDP // 返回值:socket的编号,为-1表示失败 int bind(int socket,sockaddr * address,uint addrlen); // 将一个地址和一个端口号绑定到一个socket连接上 // socket:之前创建的socket // sockaddr:一个用来存放Ip地址和端口号的结构体 // addrlen:上述结构体的长度 // 返回值:为-1表示失败,若端口被占用,会从新绑定一个随机端口(仍返回失败) // 地址绑定为0表示绑定本机所有IP int sendto(int socket,char * buf,uint buflen,int flag,sockaddr * address,uint addrlen);【仅UDP】 // 向一个指定的地址发送缓冲区内指定长度的消息 // socket:之前创建的socket // buf:要发送的缓冲区 // buflen:要发送的长度 // flag:一般为0 // sockaddr:目标地址 // addrlen:上述结构体的长度 // 返回值:发送出去的长度 int recvfrom(int socket,char * buf,uint buflen,int flag,sockaddr * fromaddr,int * addrlen);【阻塞】【仅UDP】 // 接收消息,可以获取发送方的地址 // fromaddr:发送方地址(输出参数) // addrlen:发送方地址结构体的长度(输入输出参数) // 返回值:>0表示收到的字节数,=0表示连接被关闭,-1表示出错 int recv(int socket,char * buf,uint buflen,int flag);【阻塞】 // UDP时:接收任何一个发送到该socket的消息(无法获取发送方地址) // TCP时:接收一个已连接的socket (connected socket)发送的信息 // socket:UDP时,为之前创建的socket,TCP时,为connected socket // buf:接收的缓冲区 // buflen:缓冲区的长度 // flag:一般为0 // 返回值:>0表示收到的字节数,=0表示连接被关闭,-1表示出错 // 注意:对于TCP,请确保socket是已连接的,因为只有已连接的socket会阻塞此函数 // 该函数实际上是从缓冲区取指定长度的数据,如果缓冲区没有数据,则会阻塞;如果没有取完,则下次使用此函数的时候不会阻塞 // 应注意:当一次无法获得对方发送的全部数据,在数据不完整的时候,程序可能无法向下执行,可以考虑将数据放在缓冲区中,等数据全部接收完成的时候再使用 int getsockname(int socket,sockaddr * address,int * addrlen); // 获取指定socket上绑定的IP、端口信息(不能获取connected socket上的地址信息) // address:socket上绑定的地址(输出参数) // addrlen:socket上绑定的地址结构体的长度(输入输出参数) int getpeername(int socket,,sockaddr * address,int * addrlen);【仅TCP】 // 获取一个已连接的socket的地址、端口信息 // 参数含义同上 struct sockaddr_in 一个用来指定IP地址和端口号的结构体(不太好用,建议将其封装) family // 即address family,如AF_INET port // 端口号(注意要按位倒序,使用htons函数) sin_addr.S_un.S_addr // 一个为long类型的ip地址 该结构体所有成员的字序为网络字序,低字节在前,高字节在后 int listen(int socket,int maxconn);【仅TCP】【服务器】 // 将一个socket设置为监听状态,专门用来监听的socket叫做master socket // maxconn:最大接收连接数 // 返回值:失败返回-1,成功返回0 int accept(int socket,sockaddr * fromaddr,int * addrlen);【阻塞】【仅TCP】【服务器】 // 接收一个客户机的连接,返回一个socket,来自客户机的socket叫connected socket // socket:用来监听的socket(master socket) // fromaddr:客户机的地址信息 // addrlen:地址结构体的长度(输入输出参数) // 返回值:返回一个新的socket,这个socket专门用来与此客户机通讯(connected socket) int connect(int socket,sockaddr * addr,int addrlen);【仅TCP】【客户端】 // 使用当前socket连接一个地址(与服务器建立正式连接),此函数会触发服务器端的accept、select函数 // 注意:服务端接收的socket值和客户端socket值不一样 // addr:一般是服务器地址 int send(int socket,char * buf,char buflen,int flag);【仅TCP】 // 向一个已连接的socket发送信息,这个socket应该是connected socket(非master socket) int closesocket(int socket); // 关闭一个已存在的socket【正常关闭】 // 失败返回-1,成功返回0 UDP通讯流程 WSAStartup() socket() bind() sendto(connected socket)/recv()/recvfrom() TCP通讯流程(服务器): WSAStartup() socket() bind() listen() accept() send()/recv() TCP通讯流程(客户端): WSAStartup() socket() bind() connect() send()/recv()
CreateWindowEx和CreateWindow的区别
C/C++ 6-24 596浏览 0评论CreateWindowEx 函数功能:该函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口,其他与 CreateWindow函数相同。关于创建窗口和其他参数的内容,请参看CreateWindowEx。 函数原型:HWND CreateWindowEx(DWORD dwExStle,LPCTSTR IpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENUhMenu,HANDLE hlnstance,LPVOIDlpParam); 参数: dwExStyle:指定窗口的扩展风格。该参数可以是下列值: WS_EX_ACCEPTFILES:指定以该风格创建的窗口接受一个拖拽文件。 WS_EX_APPWINDOW:当窗口可见时,将一个顶层窗口放置到任务条上。 WS_EX_CLIENTEDGE:指定窗口有一个带阴影的边界。 WS_EX_CONTEXTHELP:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗日接收到WM_HELP消息。子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。 WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。 WS_EX_CONTROLPARENT:允许用户使用Tab键在窗口的子窗口间搜索。 WS_EX_DLGMODALFRAME:创建一个带双边的窗口;该窗口可以在dwStyle中指定WS_CAPTION风格来创建一个标题栏。 WS_EX_LEFT:窗口具有左对齐属性,这是缺省设置的。 WS_EX_LEFTSCROLLBAR:如果外壳语言是如Hebrew,Arabic,或其他支持reading order alignment的语言,则标题条(如果存在)则在客户区的左部分。若是其他语言,在该风格被忽略并且不作为错误处理。 WS_EX_LTRREADING:窗口文本以LEFT到RIGHT(自左向右)属性的顺序显示。这是缺省设置的。 WS_EX_MDICHILD:创建一个MD子窗口。 WS_EX_NOPATARENTNOTIFY:指明以这个风格创建的窗口在被创建和销毁时不向父窗口发送WM_PARENTNOTFY消息。 WS_EX_OVERLAPPED:WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的组合。 WS_EX_PALETTEWINDOW:WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST风格的组合WS_EX_RIGHT:窗口具有普通的右对齐属性,这依赖于窗口类。只有在外壳语言是如Hebrew,Arabic或其他支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志并且不作为错误处理。 WS_EX_RIGHTSCROLLBAR:垂直滚动条在窗口的右边界。这是缺省设置的。 WS_EX_RTLREADING:如果外壳语言是如Hebrew,Arabic,或其他支持读顺序对齐(reading order alignment)的语言,则窗口文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其他语言,在该风格被忽略并且不作为错误处理。 WS_EX_STATICEDGE:为不接受用户输入的项创建一个3一维边界风格 WS_EX_TOOLWIDOW:创建工具窗口,即窗口是一个游动的工具条。工具窗口的标题条比一般窗口的标题条短,并且窗口标题以小字体显示。工具窗口不在任务栏里显示,当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个系统菜单,它的图标也不会显示在标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。 WS_EX_TOPMOST:指明以该风格创建的窗口应放置在所有非最高层窗口的上面并且停留在其L,即使窗口未被激活。使用函数SetWindowPos来设置和移去这个风格。 WS_EX_TRANSPARENT:指定以这个风格创建的窗口在窗口下的同属窗口已重画时,该窗口才可以重画。 由于其下的同属富日已被重画,该窗口是透明的。 IpClassName:指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobaIAddAtom函数产生的全局量。这个小于OxCOOO的16位数必须是IpClassName参数字的低16位,该参数的高位必须是O。 如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClassEx注册的类名,或是任何预定义的控制类名。请看说明部分的列表。 lpWindowName:指向一个指定窗口名的空结束的字符串指针。 如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用CreateWindow 函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。 dwStyle:指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。 x:参见CreateWindow。 y:参见CreateWindow。 nWidth:CreateWindow。 nHeigth:参见CreateWindow。 hWndParent:参见CreateWindow。 hMenu:参见CreateWindow。 hlnstance:参见CreateWindow。 lpParam:参见CreateWindow。 返回值:参见CreateWindow。 备注:参见CreateWindow。 速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:USer32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。 ----------------------------------------------------------------------------------------- CreateWindow 函数功能:该函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。该函数也指定该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。若要使用除CreateWindow函数支持的风格外的扩展风格,则使用CreateWindowEx函数代替CreateWindow函数。 函数原型: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是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClassEx注册的类名,或是任何预定义的控制类名。请看说明部分的列表。 LPWindowName:指向一个指定窗口名的空结束的字符串指针。 如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。 dwStyle:指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义: WS_BORDER:创建一个单边框的窗口。 WS_CAPTION:创建一个有标题框的窗口(包括WS_BODER风格)。 WS_CHIlD:创建一个子窗口。这个风格不能与WS_POPUP风格合用。 WS_CHLDWINDOW:与WS_CHILD相同。 WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。 WS_CLlPBLINGS;排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到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_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。 WS_OVERLAPPED:产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。 WS_OVERLAPPEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。 WS_POPUP;创建一个弹出式窗口。该风格不能与WS_CHLD风格同时使用。 WS_POPUWINDOW:创建一个具有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 MS_THICKFRAME. WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。 WS_VISIBLE:创建一个初始状态为可见的窗口。WS_VSCROLL:创建一个有垂直滚动条的窗口。 X:指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子富口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_UCEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。 Y:指定窗口的初始垂直位置。对一个层叠或弹出式窗日,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。 nWidth:以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始X坐标开始到目标区域的顶部。CW_USEDFEAULT只参层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。 nHelght:以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。 hWndParent:指向被创建窗口的父窗口或所有者窗口的旬柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗日是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。 hMenu:菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。 hlnstance:与窗口相关联的模块事例的句柄。 lpParam:指向一个值的指针,该值传递给窗口 WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。 返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。 备注:在返回前,CreateWindow给窗口过程发送一个WM_CREATE消息。对于层叠,弹出式和子窗口,CreateWindow给窗口发送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。消息WM_CREATE的IParam参数包含一个指向CREATESTRUCT结构的指针。如果指定了WS_VISIBLE风格,CreateWindow向窗口发送所有需要激活和显示窗口的消息。 获取有关任务条是否为创建的窗口显示一个按钮的控制信息,参看Taskbar按钮的Visbility。 以下预定义的控制类可以在lpClassName参数中指定。注意在dwStyle参数中可以使用的相应的控制风格。 BUTTON按钮按钮是一个小矩形子窗口,用户可以点击来打开或关闭。按钮控制可以单独使用或包含在组中使用,可以为控制写标签或不写标签。当用户点击按钮控制时按钮的外观有明显的改变。请参看Button。查看dwStyle参数中指定的按钮风格表请参考Button Style。 COMBOBOX组合框由一个列表框和一个类似于编辑控制的选择域组成。在使用这个风格控制时,应用程序或者使列表框一直显示或者是作成一个下拉列表。如果列表框可见,则在编辑域中输入字符将使列表框中与字符一致的第一个域高亮。反之,在列表框中选择的项将显示在编辑域中。请参看Combo Boxes。 查看dwStyle参数中指定的组合框风格表请参考Combo Boxes Style。 EDIT编辑框一个小的矩形子窗口用户可以使用键盘向其中输入文本。用户可以通过点击或按Tab键来选中编辑框控制并且使控制获得焦点。当编辑框中显示一个闪烁的插入记号时,用户可以输入文本。使用鼠标移动光标,选择被替换的字符或设置插入字符的位置或使用回退键删除字符。请参看Edit。controls。 查看dwStyle参数中指定的编辑框风格的表格请参考Edit Control Style。 LISTBOX列表框字符串的列表。当应用程序必须显示名称的列表,例如文件名列表等,使用户可以从中选择时就可指定列表框。用户可以通过单击来选择名称。选择时,被选择名高亮,同时传递给父窗口一个通知消息。请参看LiSt Box Style。查看dwStyle参数中指定的列表风格表请参考List BOX Control Style。 MDICLIENT MDI客户设计出MDI客户窗口。窗口接收控制MDI应用程序子窗口的消息。建议使用两种控制风格位:WS_CLIPCHILDREN和WS_CHILD。指定了WS_HSCROLL和WS_VSCROLL风格的MDI客户窗口允许用户将MDI子窗口滑动进入视窗。请参看MDI。 RiChEdit设计一个Rich Editl.0版的控制。该控制使用户可以以字符和段落格式测览和编辑文本,并且可以包含嵌入的COM对象。请参看Rich Edit Controls。查看dwStyle参数中指定的RichEdit风格表请参考LiSt Box Control Style。 RICHEDIT CLASS设计一个Rich Edik2.0版的控制。该控制使用户可以以字符和段落格式测览和编辑文本,并且可以包含嵌入的COM对象。请参看RichEditControls。查看dwStyle参数中指定的RichEdit风格表请参考RichEditControIStyle。 SCROLLBAR 滚动条设计的一个包含着一个滚动盒和两端有方向箭头的矩形。只要用户点击了控制,滚动条就给父窗口发送一个通知消息。如有必要,父窗口负责更新滚动条的位置。请参看ScrollBars。查看dwStyle参数中指定的滚动条风格表请参考Scroll Bars Style。 STATIC一个简单的静态文本域,文本盒或矩形用于给控制加标签,组合控制或将控制与其他控制分开。 静态控制不提供输入和也不提供输出。请参看Static Control Styles。查看dwStyle参数中指定的静态文本风格表请参考Scroll Bars Style。 Windows95:系统可以支持最大16,364个窗口句柄。 备注:如果在链接应用程序时指明是Windows 4.x版本,除非应用程序的窗口有窗口某单,否则窗口控制没有标题控制。对Windows3.x版本没有这种要求。 Windows CE:CreateWindow是以“宏”方式完成的。它被定义为CreateWindowEX,并且dwExStyle参数被置为长整数0。不支持菜单条控制,除非被声明为子窗口标志否则hMenu参数必须为NULL。不支持MDICLIENT窗口类。dwStyle参数可以是对话框(Dialogue Box),窗口(Windows),控制(Controls)文件中的窗口风格和控制风格的组合。 下列dwStyle标志在窗口中不支持: WS_CHILDWINDOW WS_ICONC;WS_MAXMIZE WS_MAXIMIZEBOX;WS_MINIMIZE WS_MINIMIZEBOX; WS_OVERLAPPEDWINDOW WS_POPUPWINDOW;WS_SIZEBOXWS_THICKFRAME WS_TILED WS_TILEDWINDOW 下列dwStyle标志在控制和对话框中不支持: 不支持的按钮风格和静态控制风格: BS_LEFTTEXT SS_BLACKFRAME;BS_MULTILINE SS_GRAYFRAME BS_TEXT SS_METAPICT;BS_USERBUTTON SS_SIMPLE 不支持组合框SS_WHITERECT风格。 CBS_OWNERDRAWFIXED SS_BLACKRECT;CBS_OWNWEDRAWVARIABLE SS_GRAYRECT; CBS_SIMPLE8R旧HTrIMAGE 不支持列表框控制SS_WHITEFRAME风格。 LBS_NODATA 不支持的对话框风格: LBS_OWNERDRAWFIXED DS_ABSALIGN; LBS_OWNERDRAWVARIABLE DS_CENTERMOUSE; LBS_STANDARD DS_CONTEXTHELP 不支持滚动条的 DS_FIXEDSYS风格 SBS_BOTTOMALIGN DS_NOFAILCREATE;SBS_RIGHTALIGN DS_NOIDLEMSG; SBS_SlZEBOXBOTT0MRIHTALIGN DS_SYSMODAL;SBS_SIZEGRIP 可使用BS_OWNERDRAW风格来代替BS_USERBUTTON风格。 可使用SS_LEFT或SS_LEFTNOWORDWRAP风格来代替静态控制的SS_SIMPLE风格。 不支持MDICLIENT窗口类。 所有窗口都隐含WS_CLIPSIBLINGS和 WS_CLIPCHILDREN风格。 Windows CE1.0版除对话框外不支持被属窗口。如果hwndParent参数不为NULL,则窗口隐含给出WS_CHILD风格。Windows CE1.0不支持菜单条。 速查: Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib; Unicode:在Windows NT上实现为Unicode和ANSI两种版本。 --------------------------------------------------------------
IME消息、函数、命令、需要的数据结构、常量
C/C++ 1-14 797浏览 0评论IME消息 以下列出IME中用到的消息。 WM_IME_CHAR(IME得到了转换结果中的一个字符) WM_IME_COMPOSITION(IME根据用户击键的情况更改了按键组合状态) WM_IME_COMPOSITIONFULL(IME检测到按键组合窗口的区域无法继续扩展) WM_IME_CONTROL(由应用程序直接向IME发出控制请求) WM_IME_ENDCOMPOSITION(IME完成了对用户击键情况的组合) WM_IME_KEYDOWN(检测到“键盘上的某键被按下”的动作,同时在消息队列中保留该消息) WM_IME_KEYUP(检测到“键盘上的某键已弹起”的动作,同时在消息队列中保留该消息) WM_IME_NOTIFY(IME窗口发生了改变) WM_IME_REQUEST(通知:IME需要应用程序提供命令和请求信息) WM_IME_SELECT(操作系统将改变当前IME) WM_IME_SETCONTEXT(输入焦点转移到了某个窗口上) WM_IME_STARTCOMPOSITION(IME准备生成转换结果) IME函数 本节列出了所有IME函数。 函数 说明 EnumInputContext 由应用程序定义的,提供给ImmEnumInputContext函数用来处理输入环境的一个回调函数。 EnumRegisterWordProc 由应用程序定义的,结合ImmEnumRegisterWord函数一起使用的一个回调函数。 ImmAssociateContext 建立指定输入环境与窗口之间的关联。 ImmAssociateContextEx 更改指定输入环境与窗口(或其子窗口)之间的关联。 ImmConfigureIME 显示指定的输入现场标识符的配置对话框。 ImmCreateContext 创建一个新的输入环境,并为它分配内存和初始化它。 ImmDestroyContext 销毁输入环境并释放和它关联的内存。 ImmDisableIME 关闭一个线程或一个进程中所有线程的IME功能。 ImmDisableTextFrameService 关闭指定线程的文本服务框架(TSF)功能--虽然这里把它列了出来,但建议程序员最好不要使用这个函数。 ImmEnumInputContext 获取指定线程的输入环境。 ImmEnumRegisterWord 列举跟指定读入串、样式和注册串相匹配的注册串。 ImmEscape 对那些不能通过IME API函数来访问的特殊输入法程序提供兼容性支持的一个函数。 ImmGetCandidateList 获取一个候选列表。 ImmGetCandidateListCount 获取候选列表的大小。 ImmGetCandidateWindow 获取有关候选列表窗口的信息。 ImmGetCompositionFont 获取有关当前用来显示按键组合窗口中的字符的逻辑字体的信息。 ImmGetCompositionString 获取有关组合字符串的信息。 ImmGetCompositionWindow 获取有关按键组合窗口的信息。 ImmGetContext 获取与指定窗口相关联的输入环境。 ImmGetConversionList 在不生成任何跟IME有关的消息的情况下,获取输入按键字符组合或输出文字的转换结果列表。 ImmGetConversionStatus 获取当前转换状态。 ImmGetDefaultIMEWnd 获取缺省IME类窗口的句柄。 ImmGetDescription 复制IME的说明信息到指定的缓冲区中。 ImmGetGuideLine 获取出错信息。 ImmGetIMEFileName 获取跟指定输入现场相关联的IME文件名。 ImmGetImeMenuItems 获取注册在指定输入环境的IME菜单上的菜单项。 ImmGetOpenStatus 检测IME是否打开。 ImmGetProperty 获取跟指定输入现场相关联的IME的属性和功能。 ImmGetRegisterWordStyle 获取跟指定输入现场相关联的IME所支持的样式列表。 ImmGetStatusWindowPos 获取状态窗口的位置。 ImmGetVirtualKey 获取跟IME处理的键盘输入消息相关联的初始虚拟键值。 ImmInstallIME 安装一个IME。 ImmIsIME 检测指定的输入现场是否有和它相关的IME。 ImmIsUIMessage 检查IME窗口消息并发送那些消息到特定的窗口。 ImmNotifyIME 通知IME有关输入环境状态已改变的消息。 ImmRegisterWord 注册一个输出文字到跟指定输入现场相关联的IME的字典中去。 ImmReleaseContext 销毁输入环境并解除对跟它相关联的内存的锁定。 ImmSetCandidateWindow 设置有关候选列表窗口的信息。 ImmSetCompositionFont 设置用来显示按键组合窗口中的字符的逻辑字体。 ImmSetCompositionString 设置按键组合字符串的字符内容、属性和子串信息。 ImmSetCompositionWindow 设置按键组合窗口的位置。 ImmSetConversionStatus 设置当前转换状态。 ImmSetOpenStatus 打开或关闭IME功能。 ImmSetStatusWindowPos 设置状态窗口的位置。 ImmSimulateHotKey 在指定的窗口中模拟一个特定的IME热键动作,以触发该窗口相应的响应动作。 ImmUnregisterWord 从跟指定输入环境相关联的IME的字典中注销一个输出文字。 IME命令 以下列出IME中用到的命令(控制消息)。 IMC_CLOSESTATUSWINDOW(隐藏状态窗口) IMC_GETCANDIDATEPOS(获取候选窗口的位置) IMC_GETCOMPOSITIONFONT(获取用来显示按键组合窗口中的文本的逻辑字体) IMC_GETCOMPOSITIONWINDOW(获取按键组合窗口的位置) IMC_GETSTATUSWINDOWPOS(获取状态窗口的位置) IMC_OPENSTATUSWINDOW(显示状态窗口) IMC_SETCANDIDATEPOS(设置候选窗口的位置) IMC_SETCOMPOSITIONFONT(设置用来显示按键组合窗口中的文本的逻辑字体) IMC_SETCOMPOSITIONWINDOW(设置按键组合窗口的样式) IMC_SETSTATUSWINDOWPOS(设置状态窗口的位置) IMN_CHANGECANDIDATE(IME通知应用程序:候选窗口中的内容将改变) IMN_CLOSECANDIDATE(IME通知应用程序:候选窗口将关闭) IMN_CLOSESTATUSWINDOW(IME通知应用程序:状态窗口将关闭) IMN_GUIDELINE(IME通知应用程序:将显示一条出错或其他信息) IMN_OPENCANDIDATE(IME通知应用程序:将打开候选窗口) IMN_OPENSTATUSWINDOW(IME通知应用程序:将创建状态窗口) IMN_SETCANDIDATEPOS(IME通知应用程序:已结束候选处理同时将移动候选窗口) IMN_SETCOMPOSITIONFONT(IME通知应用程序:输入内容的字体已更改) IMN_SETCOMPOSITIONWINDOW(IME通知应用程序:按键组合窗口的样式或位置已更改) IMN_SETCONVERSIONMODE(IME通知应用程序:输入内容的转换模式已更改) IMN_SETOPENSTATUS(IME通知应用程序:输入内容的状态已更改) IMN_SETSENTENCEMODE(IME通知应用程序:输入内容的语句模式已更改) IMN_SETSTATUSWINDOWPOS(IME通知应用程序:输入内容中的状态窗口的位置已更改) IMR_CANDIDATEWINDOW(通知:选定的IME需要应用程序提供有关候选窗口的信息) IMR_COMPOSITIONFONT(通知:选定的IME需要应用程序提供有关用在按键组合窗口中的字体的信息) IMR_COMPOSITIONWINDOW(通知:选定的IME需要应用程序提供有关按键组合窗口的信息) IMR_CONFIRMRECONVERTSTRING(通知:IME需要应用程序更改RECONVERTSTRING结构) IMR_DOCUMENTFEED(通知:选定的IME需要从应用程序那里取得已转换的字符串) IMR_QUERYCHARPOSITION(通知:选定的IME需要应用程序提供有关组合字符串中某个字符的位置信息) IMR_RECONVERTSTRING(通知:选定的IME需要应用程序提供一个用于自动更正的字符串) IME编程中需要用到的数据结构 这里列了所有在使用输入法编辑器函数和消息时需要用到的数据结构。 CANDIDATEFORM(描述候选窗口的位置信息) CANDIDATELIST(描述有关候选列表的信息) COMPOSITIONFORM(描述按键组合窗口的样式和位置信息) IMECHARPOSITION(描述按键组合窗口中的字符的位置信息) IMEMENUITEMINFO(描述IME菜单项的信息) RECONVERTSTRING(定义用于IME自动更正功能的字符串) REGISTERWORD(描述一个要注册的读入信息或文字内容) STYLEBUF(描述样式的标识符和名称) IME常量 这里列出了所有在使用输入法编辑器函数和消息时需要用到的常量。 ? IME转换模式常量 ? IME按键组合字符串常量 ? IME热键标识常量 ? IME句型模式常量 ? IMMEscape函数常量