聊聊[只会C语言,能做嵌入式以外的工程师吗]

职业方向分析

仅掌握C语言的开发者可以拓展以下非嵌入式领域的职业方向,但需补充相关技能:

系统开发工程师
  • 领域:操作系统、编译器、数据库等底层系统开发。
  • 技能补充:学习数据结构与算法、操作系统原理(如Linux内核)、网络协议(TCP/IP)。
  • 工具链:GCC、GDB、Makefile,熟悉Shell脚本。
游戏开发工程师
  • 领域:游戏引擎开发或高性能模块编写。
  • 技能补充:掌握OpenGL/Vulkan图形库,了解物理引擎(如Box2D),学习C++(用于Unreal/Unity插件开发)。
安全工程师
  • 领域:逆向工程、漏洞分析、安全工具开发。
  • 技能补充:学习汇编语言(x86/ARM)、渗透测试工具(如IDA Pro),了解加密算法(AES/RSA)。
高性能计算工程师
  • 领域:科学计算、金融建模、并行计算。
  • 技能补充:学习MPI、OpenMP多线程编程,掌握数值计算库(如BLAS),了解Python(用于原型设计)。
自动化测试工程师
  • 领域:测试框架开发、硬件驱动测试。
  • 技能补充:掌握Python/Robot Framework,了解持续集成工具(Jenkins)。

关键转型策略

  • 语言扩展:C语言是学习C++、Rust等系统级语言的跳板,建议逐步掌握面向对象编程。
  • 领域知识:选择目标行业(如金融、游戏)后,补充其特定技术栈(如量化交易需概率统计)。
  • 项目实践:通过GitHub贡献开源项目(如Linux内核、Redis)积累经验。

资源推荐

  • 书籍:《C程序设计语言》《深入理解计算机系统》《游戏引擎架构》。
  • 课程:Coursera的“Linux内核开发”“CSAPP实验室”。

C语言作为底层开发基石,结合领域专项技能可覆盖多数系统级岗位,转型需针对性补足知识缺口。

使用 Win32 API 创建视窗程序

在Windows平台下,使用C语言创建视窗程序通常需要调用Win32 API。以下是基本步骤和代码框架:

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const char CLASS_NAME[] = "Sample Window Class";
    
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    
    RegisterClass(&wc);
    
    HWND hwnd = CreateWindowEx(
        0,
        CLASS_NAME,
        "Windows Program",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    
    if (hwnd == NULL) return 0;
    
    ShowWindow(hwnd, nCmdShow);
    
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW+1));
            EndPaint(hwnd, &ps);
        }
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

编译和链接

编译Win32程序需要指定链接Windows库。使用gcc编译器的命令如下:

gcc win_prog.c -o win_prog.exe -mwindows

使用现代工具链

对于更现代的开发环境,可以考虑使用Visual Studio或MinGW-w64:

  1. 安装Visual Studio Community版并选择"C++桌面开发"工作负载
  2. 创建新项目时选择"Windows桌面应用程序"
  3. 或者使用CMake构建系统

使用GTK+创建跨平台GUI

如果需要跨平台支持,可以使用GTK+库:

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer user_data)
{
    GtkWidget *window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "GTK Window");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    
    GtkWidget *button = gtk_button_new_with_label("Hello World");
    gtk_container_add(GTK_CONTAINER(window), button);
    
    gtk_widget_show_all(window);
}

int main(int argc, char **argv)
{
    GtkApplication *app = gtk_application_new("org.example.app", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);
    
    return status;
}

编译GTK程序需要安装开发包,在Ubuntu上命令为:

sudo apt-get install libgtk-3-dev
gcc gtk_prog.c -o gtk_prog `pkg-config --cflags --libs gtk+-3.0`

其他GUI库选项

  1. wxWidgets:C++框架,但有C接口
  2. FLTK:轻量级跨平台GUI库
  3. SDL:主要用于游戏开发,但也支持创建窗口

资源管理

Windows程序通常需要管理资源,如:

  • 图标
  • 菜单
  • 对话框
  • 字符串表

这些资源通常在资源脚本(.rc)文件中定义,然后由资源编译器编译。

用c语言编写视窗程序

在C语言中编写Windows视窗程序,通常会使用Win32 API来实现。Win32 API是Microsoft提供的一套用于Windows编程的API,它包括了创建窗口、绘制图形、处理消息等功能。下面将通过一个简单的示例来展示如何使用Win32 API创建一个基本的窗口应用程序。

第一步:设置开发环境

确保你的开发环境已安装,如Visual Studio,它支持Win32 API的开发。

第二步:创建新的Win32项目

  1. 打开Visual Studio。

  2. 选择“创建新项目”。

  3. 在项目类型中选择“Windows桌面”,然后选择“Windows桌面应用程序”。

  4. 命名你的项目,例如“HelloWin32”,然后点击“创建”。

  5. 在接下来的对话框中,选择“Windows应用程序”,然后点击“完成”。

第三步:修改代码以创建窗口

打开main.c(或main.cpp,如果你的项目设置为使用C++)文件,并替换或修改其内容如下:

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

switch (uMsg) {

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_PAINT:

{

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hwnd, &ps);

// 在这里绘制内容

TextOut(hdc, 5, 5, "Hello, Win32!", 12); // 在窗口中绘制文本

EndPaint(hwnd, &ps);

}

return 0;

}

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

const char CLASS_NAME[] = "Sample Window Class";

WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WindowProc, 0, 0, hInstance, LoadIcon(NULL, IDI_APPLICATION), LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1), NULL, CLASS_NAME };

RegisterClass(&wc);

HWND hwnd = CreateWindowEx(0, CLASS_NAME, "Learn Win32 Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

if (hwnd == NULL) {

return 0;

}

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

MSG msg;

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

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

第四步:编译和运行程序

  1. 在Visual Studio中,点击“生成”菜单,选择“生成解决方案”。

  2. 程序编译并运行后,你将看到一个简单的窗口,上面写着“Hello, Win32!”。

解释代码:

  • WindowProc:这是窗口过程函数,处理所有窗口的消息。例如,WM_DESTROY消息用来关闭窗口,WM_PAINT消息用来重绘窗口。

  • WinMain:这是Windows程序的入口点。它注册一个窗口类,创建一个窗口实例,并进入消息循环。

  • CreateWindowEx:创建一个窗口。

  • ShowWindow 和 UpdateWindow:显示并更新窗口。

  • GetMessageTranslateMessageDispatchMessage:从消息队列中获取消息,翻译并分发消息。

以上就是使用C语言和Win32 API创建一个基本Windows视窗程序的过程。可以在此基础上添加更多的功能和复杂的UI元素。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值