Thank you for your reply.
I tried to set the UV morph through each surface, but it did not work according to my assumptions. Here I want to move the entire uv, but only part of the uv is moved. What is wrong.
Int32 offset_count;//The UV morph vertex count.
maxon::HashMap<Int32, Vector> vertex_floats_map; //This map stores the UV transformation of each vertex.
//Create the basic morph
morph_tag->ExitEdit(doc, true);
CAMorph *morph = morph_tag->AddMorph();
if (morph == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION, GeLoadString(IDS_MES_IMPORT_ERR) + GeLoadString(IDS_MES_MEM_ERR));
morph->SetName(morph_data->morph_name_local);
morph->Store(doc, morph_tag, CAMORPH_DATA_FLAGS::UV);
CAMorphNode *morph_node = morph->GetFirst();
morph->SetMode(doc, morph_tag, CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::EXPAND, CAMORPH_MODE::REL);
maxon::ParallelFor::Dynamic(0, offset_count, [&morph_node, &vertex_surface_map, &vertex_floats_map](const Int32 pointIndex)
{
Int surface_index; //The surface index corresponding to the vertex, the acquisition process is omitted.
CPolygon *surface = surface_data.Read()->operator[](surface_index); //Get the corresponding surface.
UVWStruct uvw;
morph_node->GetUV(0, surface_index, uvw);
auto vertex_a_ptr = vertex_floats_map.Find(surface->a);
if (vertex_a_ptr != nullptr)
{
uvw.c = vertex_a_ptr->GetValue();
}
auto vertex_b_ptr = vertex_floats_map.Find(surface->b);
if (vertex_b_ptr != nullptr)
{
uvw.b = vertex_b_ptr->GetValue();
}
auto vertex_c_ptr = vertex_floats_map.Find(surface->c);
if (vertex_c_ptr != nullptr)
{
uvw.a = vertex_c_ptr->GetValue();
}
morph_node->SetUV(0, surface_index, uvw);
});
morph->SetMode(doc, morph_tag, CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::COLLAPSE, CAMORPH_MODE::AUTO);
morph_tag->UpdateMorphs();
morph_tag->Message(MSG_UPDATE);
morph->SetStrength(0);
morph_tag->SetParameter(DescID(ID_CA_POSE_MODE), ID_CA_POSE_MODE_ANIMATE, DESCFLAGS_SET::NONE);
Please see here for the complete.

Thanks,
AiMiDi